1. Ако потребителят по погрешка създаде всичките си обекти със супер-потребител (postgres) и по-късно възнамерява да се смени с друг потребител, тогава REASSIGN OWNED BY няма да работи и просто излиза като грешка като:
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. Ако потребителят желае да промени собствеността само на един обект на схема.
Независимо от случаите на промяна на обекти, от потребител на “postgres” към друг потребител, или просто промяна на само един обект на схема, ние трябва да преминем през всеки обект, като съберем детайли за обекта от pg_catalog's &information_schema и извикаме ALTER TABLE / FUNCTION / AGGREGATE / TYPE и др.
Хареса ми техниката за настройване на изхода на pg_dump с помощта на команди на ОС (sed/egrep), защото се знае, че по природа pg_dump пише ALTER .. OWNER TO на всеки обект (ТАБЛИЦИ / ПОСЛЕДОВАНИЯ / ИЗГЛЕДИ / ФУНКЦИИ / АГРЕГАТИ / ТИПОВЕ ) в неговия изход. Извличането на тези изрази от pg_dump stdout чрез замяна на new USER/SCHEMANAME със sed и след това връщане на тези оператори към psql клиента ще поправи нещата, дори ако обектът е собственост на потребител на Postgres. Използвах същия подход в скрипта и позволих на потребителя да предаде НОВО ПОТРЕБИТЕЛСКО ИМЕ и ИМЕ НА СХЕМА, така че да го заменя в оператор ALTER...OWNER TO..
Използване и изход на скрипт:
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
Можете да изтеглите скрипта от тук, а има и README, който да ви помогне при използването.