PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Jatuhkan peran dengan hak istimewa

Jalankan ini di setiap database dari cluster yang sama di mana peran tersebut mungkin memiliki apa saja atau memiliki hak istimewa yang diberikan:

REASSIGN OWNED BY some_role_name TO postgres;
DROP OWNED BY some_role_name;

postgres sebagai pengguna super default, Anda dapat memilih yang lain. Itu akan memiliki objek yang saat ini dimiliki oleh peran lama. Segera setelah REASSIGN OWNED , tidak ada objek tersisa yang akan dimiliki oleh pengguna yang sama. Tampaknya tidak intuitif untuk menjalankan DROP OWNED . Kata-kata dari perintah itu menyesatkan, karena juga mencabut semua hak istimewa dan hak default untuk peran dalam database yang sama. Manual:

Penekanan saya yang berani.
Anda masih harus menjalankannya di setiap database di mana peran memiliki sesuatu atau memiliki hak istimewa yang diberikan. Panduan:

Terakhir, jalankan (sekali):

DROP role some_role_name;

Peran disimpan dalam katalog sistem di seluruh cluster, sementara kepemilikan dan hak istimewa pada objek disimpan dalam katalog sistem database-lokal.

Penjelasan terperinci dalam jawaban terkait ini:

Ada halaman terkait di manual dengan petunjuk .

Otomasi penuh

Tidak ada perintah tunggal untuk melakukan semuanya. Tetapi Anda dapat membiarkan Postgres membuat skrip psql lengkap untuk Anda.

Dependensi untuk peran disimpan dalam katalog sistem pg_shdepend :

Karena kita (berpotensi) perlu terhubung ke database yang berbeda, kita memerlukan kombinasi perintah meta psql (\c my_database ) dan perintah SQL DDL seperti yang ditunjukkan di atas. Buat fungsi ini di suatu tempat di cluster DB Anda sekali:

CREATE OR REPLACE FUNCTION f_generate_ddl_to_remove_role(dead_role_walking regrole)
  RETURNS text
  LANGUAGE sql AS
$func$
SELECT concat_ws(
   E'\n'
 ,(SELECT string_agg(format(E'\\c %I\nREASSIGN OWNED BY %2$s TO postgres; DROP OWNED BY %2$s;'
                          , d.datname, dead_role_walking)
                   , E'\n')
   FROM  (
      SELECT DISTINCT dbid
      FROM   pg_shdepend
      WHERE  refobjid = dead_role_walking
      ) s
   JOIN   pg_database d ON d.oid = s.dbid)
 , format(E'DROP role %s;\n', dead_role_walking)
   )
$func$;

Telepon:

SELECT f_generate_ddl_to_remove_role('some_role_name');

Menghasilkan string seperti:

\c my_db1
REASSIGN OWNED BY some_role_name TO postgres; DROP OWNED BY some_role_name;
\c my_db2
REASSIGN OWNED BY some_role_name TO postgres; DROP OWNED BY some_role_name;
DROP role some_role_name;

Atau, jika peran tidak memiliki apa pun dan tidak memiliki hak istimewa, cukup:

DROP role some_role_name;

Jika Anda memberikan nama peran yang tidak ada, Anda akan mendapatkan kesalahan.

Salin string (tanpa menyertakan tanda kutip tunggal) ke sesi psql yang dibuka dengan pengguna super seperti postgres . Atau gabungkan skrip bash dengannya. Semua selesai.

Ada beberapa jawaban terkait dengan penjelasan lebih lanjut untuk SQL dinamis:



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PostgreSQL:KUNCI ASING/ON DELETE CASCADE

  2. 3 Cara Mendaftar semua Prosedur Tersimpan dalam Database PostgreSQL

  3. bagaimana cara melakukan kurang dari atau sama dengan dan lebih besar dari sama dengan di filter Django?

  4. Peran drop PostgreSQL gagal karena hak default

  5. PostgreSQL ke XML dengan 3 Tabel