Kør dette i hver database i den samme klynge, hvor rollen kan eje noget eller have tildelte rettigheder:
REASSIGN OWNED BY some_role_name TO postgres;
DROP OWNED BY some_role_name;
postgres
som standard superbruger, kan du vælge en hvilken som helst anden. Det kommer til at eje genstande, der i øjeblikket ejes af den gamle rolle. Umiddelbart efter GENOVERDRAG EJET
, er der ingen objekter tilbage, der ville være ejet af samme bruger. Det kan virke uintuitivt at køre DROP OWNED
. Ordlyden af kommandoen er vildledende, da den også tilbagekalder alle privilegier og standardprivilegier for rollen i den samme database. Manualen:
Fed fremhævelse min.
Du skal stadig udføre det i hver enkelt database hvor rollen ejer noget eller har tildelte privilegier. Manualen:
Kør endelig (en gang):
DROP role some_role_name;
Roller gemmes i et klyngedækkende systemkatalog, mens ejerskab og privilegier på objekter gemmes i databaselokale systemkataloger.
Detaljeret forklaring i dette relaterede svar:
Der er en relateret side i manualen med instruktioner .
Fuld automatisering
Der er ingen enkelt kommando til at gøre det hele. Men du kan lade Postgres generere et komplet psql-script til dig.
Afhængigheder for roller er gemt i systemkataloget pg_shdepend
:
Da vi (potentielt) skal oprette forbindelse til forskellige databaser, har vi brug for en kombination af psql-metakommandoer (\c my_database
) og SQL DDL-kommandoer som vist ovenfor. Opret denne funktion et sted i din DB-klynge én gang:
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$;
Ring til:
SELECT f_generate_ddl_to_remove_role('some_role_name');
Fremstiller en streng som:
\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;
Eller, hvis rollen ikke ejer noget og ikke har nogen privilegier, skal du blot:
DROP role some_role_name;
Hvis du angiver et ikke-eksisterende rollenavn, får du en fejl.
Kopier strengen (uden at omslutte enkelte anførselstegn) til en psql-session åbnet med en superbruger som postgres
. Eller sammenkæde et bash-script med det. Alt færdigt.
Der er flere relaterede svar med mere forklaring på dynamisk SQL: