PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Премахване на роля с привилегии

Изпълнете това във всяка база данни на същия клъстер, където ролята може да притежава нещо или да има предоставени привилегии:

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:



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Заявката на Postgres за проверка на низ е число

  2. Има ли начин да се използват масиви в Entity Framework + PostgreSql

  3. Тип поле на Rails 4 за множествен избор с предварително дефинирани стойности

  4. Когато трябва да стартирате REINDEX в postgres

  5. 2 начина да получите размера на база данни в PostgreSQL