PostgreSQL Thay đổi chủ sở hữu của tất cả các bảng trong một lược đồ cụ thể


19

Tôi đang cố gắng thay đổi chủ sở hữu của tất cả các bảng trong cùng một lược đồ trong một dòng lệnh. tức là : alter table schema_name.* owner to newowner. Có cách nào để thực hiện điều đó?

Câu trả lời:


11

Tái chỉ định sở hữu

Có một lệnh đặc quyền cụ thể thực hiện điều này RESASSIGN OWNED. Điều này gán lại tất cả các đối tượng, không chỉ các đối tượng trong một lược đồ cụ thể.

Lược đồ đặc hiệu

Bạn có thể tạo các ALTER TABLElệnh với điều sau đây,

SELECT format(
  'ALTER TABLE %I.%I.%I OWNER TO %I;',
  table_catalog,
  table_schema,
  table_name,
  current_user  -- or another just put it in quotes
)
FROM information_schema.tables
WHERE table_schema = 'mySchema';

Trong psql, bạn có thể chạy chúng bằng cách theo dõi nó ngay lập tức với \gexec


8

Tôi không biết cách nào để thực hiện điều này hoàn toàn thông qua psql, nhưng bằng cách sử dụng bash, bạn có thể liệt kê các bảng trong cơ sở dữ liệu $ DB với:

psql -tc "select tablename from pg_tables where schemaname = '${SCHEMA}';" ${DB}

Và quyền sở hữu có thể được chuyển sang $ OWNER với:

psql -c "alter table ${SCHEMA}.${table} owner to ${OWNER}" ${DB}

Kết hợp chuỗi này lại với nhau:

 $ for table in `psql -tc "select tablename from pg_tables where schemaname = '${SCHEMA}';" ${DB}` ; do  psql -c "alter table ${SCHEMA}.${table} owner to ${OWNER}" ${DB} ; done

$ DB, $ SCHema và $ OWNER đại diện cho cơ sở dữ liệu, lược đồ (thường là 'công khai') và tên của chủ sở hữu mới tương ứng.


7

Nếu bạn có thể truy vấn các tablename trong lược đồ của mình, bạn có thể tạo các truy vấn để sở hữu bảng ALTER.

Ví dụ:

 select 'ALTER TABLE ' || t.tablename || ' OWNER TO new_owner;' 
 from  pg_tables t
 where t.tableowner != 'rdsadmin';

sẽ trả về truy vấn để thay đổi quyền sở hữu của tất cả các bảng:

ALTER TABLE schema_version OWNER TO ali;
ALTER TABLE users OWNER TO ali; 
ALTER TABLE company OWNER TO ali;
ALTER TABLE books OWNER TO ali;
...

sau đó bạn chỉ có thể chạy chúng :)


1

Kịch bản này sẽ thực hiện các mẹo.

sh change_owner.sh -n new_owner -S schema_name

sh change_owner.sh -n user1 -S public

Summary:
    Tables/Sequences/Views : 16
    Functions              : 43
    Aggregates             : 1
    Type                   : 2

tìm thấy ở đây https://github.com/trrao/PostgreSQL_Scripts


0

Tương tự như trên bằng cách sử dụng bash nhưng tôi đã phải xuất ra một tệp văn bản và sau đó nhập vào psql:

$ psql -qAt -d mydatabase -c "SELECT 'ALTER TABLE '||schemaname||'.'||tablename||' \
                                      OWNER TO new_owner;' \
                                      FROM pg_tables \
                                      WHERE schemaname = 'myschema'" > data.txt


$ psql < data.txt -d mydatabase

Dựa trên cơ sở này, nhưng cơ sở dữ liệu đã được thêm: http://penningpence.blogspot.ca/2014/09/changing-owner-of-mult Môn- database.html


0

Đây là một hàm tôi sử dụng để thay đổi bảng, dạng xem và quyền sở hữu hàm trong một lược đồ. Nó là nhanh, sạch và là một ví dụ tốt về cách sử dụng con trỏ là tốt. Ngoài ra, không có dòng lệnh yêu cầu.

Sau đây sẽ thay đổi quyền thông qua chức năng plpgsql:

CREATE OR REPLACE FUNCTION YOURSCHEMA.do_changeowner(
    newowner text,
    pschem text)
  RETURNS void AS
$BODY$
declare
  tblnames CURSOR FOR
    SELECT tablename FROM pg_tables
    WHERE schemaname = pschem;
  viewnames CURSOR FOR
    SELECT viewname FROM pg_views
    WHERE schemaname = pschem;
  funcnames CURSOR FOR
    SELECT p.proname AS name, pg_catalog.pg_get_function_identity_arguments(p.oid) as params
    FROM pg_proc p 
    JOIN pg_namespace n ON n.oid = p.pronamespace 
    WHERE n.nspname = pschem;

begin

  FOR stmt IN tblnames LOOP
    EXECUTE 'alter TABLE ' || pschem || '.' || stmt.tablename || ' owner to ' || newowner || ';';
  END LOOP;
  FOR stmt IN viewnames LOOP
    EXECUTE 'alter VIEW ' || pschem || '.' || stmt.viewname || ' owner to ' || newowner || ';';
  END LOOP;
  FOR stmt IN funcnames LOOP
    EXECUTE 'alter FUNCTION ' || pschem || '.' || stmt.name || '(' ||  stmt.params || ') owner to ' || newowner || ';';
  END LOOP;

END;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.