PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Zrezygnuj z roli z uprawnieniami

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:



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak wstawić JSONB do Postgresql za pomocą Pythona?

  2. Jak JSON Marshall a pq.NullTime w UTC zamiast lokalnej strefy czasowej?

  3. Odpowiednik Postgresql GROUP_CONCAT?

  4. Docker- django zgłasza błąd podczas łączenia się z postgres:psycopg2.OperationalError:nie można połączyć się z serwerem:Połączenie odrzucone

  5. Jak w pg_restore użyć ciągu połączenia Postgres do określenia hosta/bazy danych/nazwy użytkownika/hasła?