Изпълнете това във всяка база данни на същия клъстер, където ролята може да притежава нещо или да има предоставени привилегии:
REASSIGN OWNED BY some_role_name TO postgres;
DROP OWNED BY some_role_name;
postgres
тъй като е суперпотребител по подразбиране, можете да изберете всеки друг. Той ще притежава обекти, които в момента са собственост на старата роля. Веднага след ПРЕЗНАЧАВАНЕ НА СОБСТВЕНОСТ
, не са останали обекти, които биха били притежавани от същия потребител. Може да изглежда неинтуитивно да стартирате DROP OWNED
. Формулировката на командата е подвеждаща, тъй като също отменя всички привилегии и привилегии по подразбиране за ролята в същата база данни. Ръководството:
Удебелен акцент е мой.
Все още трябва да го изпълните във всяка база данни когато ролята притежава нещо или има предоставени привилегии. Ръководството:
Накрая изпълнете (веднъж):
DROP role some_role_name;
Ролите се съхраняват в системен каталог за целия клъстер, докато собствеността и привилегиите върху обекти се съхраняват в системни каталози на локална база данни.
Подробно обяснение в този свързан отговор:
Има свързана страница в ръководството с инструкции .
Пълна автоматизация
Няма една команда, която да направи всичко. Но можете да позволите на Postgres да генерира пълен psql скрипт вместо вас.
Зависимостите за роли се съхраняват в системния каталог pg_shdependкод>
:
Тъй като (потенциално) трябва да се свържем с различни бази данни, имаме нужда от комбинация от psql мета-команди (\c my_database
) и SQL DDL команди, както е показано по-горе. Създайте тази функция някъде във вашия 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$;
Обаждане:
SELECT f_generate_ddl_to_remove_role('some_role_name');
Създава низ като:
\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;
Или, ако ролята не притежава нищо и няма привилегии, просто:
DROP role some_role_name;
Ако предоставите несъществуващо име на роля, ще получите грешка.
Копирайте низа (без поставяне в единични кавички) в psql сесия, отворена със суперпотребител като postgres
. Или свържете bash скрипт с него. Готово.
Има няколко свързани отговора с повече обяснения за динамичния SQL: