1. Si el usuario por error crea todos sus objetos con superusuario (postgres), y luego tiene la intención de cambiar a otro usuario, entonces REASIGNAR PROPIEDAD DE no funcionará y simplemente saldrá como:
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. Si el usuario desea cambiar solo la propiedad de un objeto de esquema.
Ya sea en casos de cambio de objetos, de usuario "postgres" a otro usuario o simplemente cambiando solo un objeto de esquema, necesitamos recorrer cada objeto recopilando detalles del objeto de pg_catalog's &information_schema y llamando a ALTER TABLE / FUNCTION / AGGREGATE / TYPE etc.
Me gustó la técnica de ajustar la salida de pg_dump usando los comandos del sistema operativo (sed/egrep), porque sabía que, por naturaleza, pg_dump escribe ALTER .. OWNER TO de cada objeto (TABLES / SEQUENCES / VIEWS / FUNCTIONS / AGGREGATES / TYPES ) en su salida. Grep'ing esas declaraciones de pg_dump stdout reemplazando new USER/SCHEMANAME con sed y luego devolviendo esas declaraciones al cliente psql arreglará las cosas incluso si el objeto es propiedad del usuario de Postgres. Utilicé el mismo enfoque en la secuencia de comandos y permití que el usuario pasara NUEVO NOMBRE DE USUARIO y NOMBRE DE ESQUEMA, para reemplazarlo en ALTERAR... PROPIETARIO A... declaración.
Uso y salida del 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
Puede descargar el script desde aquí, y también hay README para ayudarlo con el uso.