sql >> Database teknologi >  >> RDS >> PostgreSQL

Drop en rolle med privilegier

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:



  1. grupper ved at tilføje værdierne

  2. Forskelle mellem utf8 og latin1

  3. Hvad er der galt med denne kode, der bruger mysql-udvidelsen til at hente data fra en database i PHP?

  4. hvordan man beregner intervaller i oracle