1. Pokud uživatel omylem vytvoří všechny své objekty se super-uživatelem (postgres) a později zamýšlí změnit na jiného uživatele, pak REASSIGN OWNED BY nebude fungovat a dojde pouze k chybě 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. Pokud si uživatel přeje změnit vlastnictví pouze jednoho objektu schématu.
Ať už jde o změnu objektů, z uživatele „postgres“ na jiného uživatele, nebo jen o změnu pouze jednoho objektu schématu, musíme procházet každý objekt shromažďováním podrobností o objektu z pg_catalog's &information_schema a voláním ALTER TABLE / FUNCTION / AGGREGATE / TYPE atd.
Líbila se mi technika ladění výstupu pg_dump pomocí příkazů OS (sed/egrep), protože bylo známo, že pg_dump přirozeně zapisuje ALTER .. OWNER TO každého objektu (TABULKY / SEKVENCE / ZOBRAZENÍ / FUNKCE / AGREGÁTY / TYPY ) ve svém výstupu. Greping těchto příkazů z pg_dump stdout nahrazením nového USER/SCHEMANAME sed a následným předáním těchto příkazů zpět klientovi psql věci napraví, i když objekt vlastní uživatel Postgres. Použil jsem stejný přístup ve skriptu a umožnil jsem uživateli předat NOVÉ UŽIVATELSKÉ JMÉNO a NÁZEV SCHÉMATU, takže je nahradit v příkazu ALTER…OWNER TO..
Použití a výstup skriptu:
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
Zde si můžete stáhnout skript a je zde také README, který vám pomůže s používáním.