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

Jak zmienić własność wszystkich obiektów w określonym schemacie w PostgreSQL?

Kilka sugestii tutaj (Dzięki), zainspirowało mnie do napisania skryptu bash do zmiany wszystkich (TABEL/SEKWENCJI/WIDOKÓW/FUNKCJI/AGREGATÓW/TYPÓW) własność w określonym schemacie za jednym razem. Brak specjalnego kodu zawartego w skrypcie, w zasadzie wybrałem sugerowaną technikę i uprościłem metodę implementacji za pomocą skryptu. W rzeczywistości polecenie REASSIGN OWNED BY wykonuje większość pracy płynnie, jednak zmienia własność obiektów w całej bazie danych, niezależnie od dowolnego schematu. Dwie możliwości, w których nie możesz użyć ZMIANY WŁASNOŚCI:

1. Jeśli użytkownik przez pomyłkę utworzy wszystkie swoje obiekty za pomocą superużytkownika (postgres), a później zamierza zmienić go na innego użytkownika, PONOWNE PRZYPISANIE WŁASNE PRZEZ NIE zadziała, a po prostu wystąpi błąd jako:

postgres=# reassign owned by postgres to user1;
ERROR: cannot reassign ownership of objects owned by role postgres because they are required by the database system

2. Jeśli użytkownik chce zmienić właściciela tylko jednego obiektu schematu.

W przypadku zmiany obiektów, z użytkownika „postgres” na innego użytkownika, lub tylko zmiany tylko jednego obiektu schematu, musimy przejść pętlą przez każdy obiekt, zbierając szczegóły obiektu z pg_catalog &information_schema i wywołując ALTER TABLE / FUNCTION / AGGREGATE / TYPE itp.

Podobała mi się technika dostrajania wyjścia pg_dump za pomocą poleceń systemu operacyjnego (sed/egrep), ponieważ wiedziałem, że z natury pg_dump zapisuje ALTER .. OWNER TO każdego obiektu (TABELI / SEKWENCJE / WIDOKI / FUNKCJE / AGREGATÓW / TYPY ) w swoim wyjściu. Grepowanie tych instrukcji z pg_dump stdout przez zastąpienie nowego USER/SCHEMANAME przez sed, a następnie przekazanie tych instrukcji do klienta psql naprawi to, nawet jeśli obiekt jest własnością użytkownika Postgres. Użyłem tego samego podejścia w skrypcie i pozwoliłem użytkownikowi przekazać NEW USER NAME i SCHEMA NAME, aby zastąpić je w instrukcji ALTER…OWNER TO..

Wykorzystanie i wyjście skryptu:

sh change_owner.sh  -n new_rolename -S schema_name

-bash-4.1$ sh change_owner.sh -n user1 -S public

Summary:
Tables/Sequences/Views : 16
Functions : 43
Aggregates : 1
Type : 2

Skrypt możesz pobrać stąd, a także README, które pomoże Ci w użyciu.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PostgreSQL UTWÓRZ TABELĘ

  2. Wektor geometrii ST_HexagonGrid, aby znaleźć wszystkie punkty

  3. Zdefiniować nazwy tabel i kolumn jako argumenty w funkcji plpgsql?

  4. MNIEJSZE PODOBNE vs iLIKE

  5. Spring + Hibernate:Wykorzystanie pamięci podręcznej planu zapytań