PostgreSQL Ubah pemilik semua tabel di bawah skema tertentu

19

Saya mencoba mengubah pemilik semua tabel di bawah skema yang sama dalam satu baris perintah. yaitu: alter table schema_name.* owner to newowner. Apakah ada cara untuk mencapai itu?

Nasib memutar
sumber

Jawaban:

11

Ditugaskan Kembali Dimiliki

Ada perintah privilege khusus yang melakukan hal ini RESASSIGN OWNED,. Ini menetapkan ulang semua objek, bukan hanya yang ada di skema tertentu.

Khusus skema

Anda dapat menghasilkan ALTER TABLEperintah dengan yang berikut ini,

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';

Dalam psql, Anda dapat menjalankannya dengan segera mengikutinya \gexec

Evan Carroll
sumber
8

Saya tidak tahu cara untuk menyelesaikan ini murni melalui psql, tetapi menggunakan bash, Anda dapat mendaftar tabel dalam database $ DB dengan:

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

Dan kepemilikan dapat ditransfer ke $ PEMILIK dengan:

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

Merangkai ini bersama memberi Anda:

 $ 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 dan $ OWNER masing-masing mewakili database, skema (biasanya 'publik') dan nama pemilik baru.

jrial
sumber
7

Jika Anda bisa menanyakan nama-nama tab dalam skema Anda, Anda bisa membuat kueri untuk mengubah kepemilikan tabel.

Sebagai contoh:

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

akan mengembalikan kueri untuk mengubah kepemilikan semua tabel:

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;
...

maka Anda bisa menjalankan ini :)

Ali Saeed
sumber
1

Script ini akan melakukan triknya.

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

ditemukan di sini https://github.com/trrao/PostgreSQL_Scripts

yatabani
sumber
0

Mirip dengan di atas menggunakan bash tapi saya harus output dalam file teks dan kemudian masukan ke 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

Berdasarkan ini, tetapi database menambahkan: http://penningpence.blogspot.ca/2014/09/changing-owner-of-multiple-database.html

riley
sumber
0

Ini adalah fungsi yang saya gunakan untuk mengubah tabel, tampilan, dan kepemilikan fungsi dalam suatu skema. Cepat, bersih, dan merupakan contoh yang baik tentang cara menggunakan kursor. Juga, tidak ada baris perintah yang diperlukan.

Berikut ini akan mengubah izin melalui fungsi 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;
Martin Jstone
sumber