Uruchom to w każdej bazie danych tego samego klastra, w której rola może posiadać cokolwiek lub mieć przyznane uprawnienia:
REASSIGN OWNED BY some_role_name TO postgres;
DROP OWNED BY some_role_name;
postgres
będąc domyślnym superużytkownikiem, możesz wybrać dowolnego innego. Będzie właścicielem obiektów będących obecnie w posiadaniu starej roli. Natychmiast po PRZEPIŚ WŁAŚCICIEL
, nie ma żadnych obiektów, które byłyby własnością przez tego samego użytkownika. Uruchomienie DROP OWNED
może wydawać się nieintuicyjne
. Sformułowanie polecenia jest mylące, ponieważ również cofa wszystkie uprawnienia i uprawnienia domyślne dla roli w tej samej bazie danych. Instrukcja:
Pogrubiony nacisk na kopalnię.
Nadal musisz wykonać to w każdej bazie danych gdzie rola jest właścicielem czegokolwiek lub ma przyznane uprawnienia. Instrukcja:
Na koniec uruchom (raz):
DROP role some_role_name;
Role są przechowywane w katalogu systemowym obejmującym cały klaster, podczas gdy prawa własności i uprawnienia do obiektów są przechowywane w katalogach systemowych lokalnych baz danych.
Szczegółowe wyjaśnienie w tej powiązanej odpowiedzi:
W podręczniku znajduje się powiązana strona z instrukcjami .
Pełna automatyzacja
Nie ma jednego polecenia, aby to wszystko zrobić. Ale możesz pozwolić Postgresowi wygenerować dla Ciebie kompletny skrypt psql.
Zależności dla ról są przechowywane w katalogu systemowym pg_shdepend
:
Ponieważ (potencjalnie) musimy łączyć się z różnymi bazami danych, potrzebujemy kombinacji meta-komend psql (\c moja_baza danych
) i polecenia SQL DDL, jak pokazano powyżej. Utwórz tę funkcję raz w swoim klastrze DB:
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$;
Zadzwoń:
SELECT f_generate_ddl_to_remove_role('some_role_name');
Tworzy ciąg taki jak:
\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;
Lub, jeśli rola nie posiada niczego i nie ma uprawnień, po prostu:
DROP role some_role_name;
Jeśli podasz nieistniejącą nazwę roli, pojawi się błąd.
Skopiuj ciąg (bez umieszczania pojedynczych cudzysłowów) do sesji psql otwartej z superużytkownikiem, takim jak postgres
. Lub połącz z nim skrypt basha. Wszystko gotowe.
Istnieje kilka powiązanych odpowiedzi, które zawierają więcej wyjaśnień dotyczących dynamicznego SQL: