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.