1. Se l'utente per errore crea tutti i suoi oggetti con super-utente (postgres), e in seguito intende passare a un altro utente, allora REASSIGN OWNED BY non funzionerà e semplicemente comporterà un errore come:
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. Se l'utente desidera modificare solo una proprietà degli oggetti dello schema.
In entrambi i casi di modifica degli oggetti, dall'utente "postgres" ad un altro utente o semplicemente modificando un solo oggetto dello schema, è necessario scorrere ogni oggetto raccogliendo i dettagli dell'oggetto da pg_catalog's &information_schema e chiamando ALTER TABLE / FUNCTION / AGGREGATE / TYPE ecc.
Mi è piaciuta la tecnica di modificare l'output di pg_dump usando i comandi del sistema operativo (sed/egrep), perché sapeva che per natura il pg_dump scrive ALTER .. OWNER TO di ogni oggetto (TABLES / SEQUENCES / VIEWS / FUNCTIONS / AGGREGATES / TYPES ) nel suo output. Grep'ing quelle istruzioni da pg_dump stdout sostituendo new USER/SCHEMANAME con sed e quindi restituendo quelle istruzioni al client psql risolverà le cose anche se l'oggetto è di proprietà dell'utente Postgres. Ho utilizzato lo stesso approccio nello script e ho consentito all'utente di passare NEW USER NAME e SCHEMA NAME, in modo da sostituirlo nell'istruzione ALTER...OWNER TO..
Uso e output degli script:
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
Puoi scaricare lo script da qui e c'è anche README per aiutarti nell'utilizzo.