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: