1. Se o usuário, por engano, criar todos os seus objetos com super-usuário (postgres), e depois pretender mudar para outro usuário, então REASSIGN OWNED BY não funcionará e simplesmente errará 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. Se o usuário desejar alterar apenas a propriedade de um objeto de esquema.
Seja nos casos de alteração de objetos, de usuário “postgres” para outro usuário ou apenas alterando apenas um objeto de esquema, precisamos percorrer cada objeto coletando detalhes do objeto de pg_catalog &information_schema e chamando ALTER TABLE / FUNCTION / AGGREGATE / TYPE etc.
Gostei da técnica de ajustar a saída do pg_dump usando os comandos do SO (sed/egrep), pois sabia que por natureza o pg_dump escreve ALTER .. OWNER TO de cada objeto (TABLES/SEQUENCES/VIEWS/FUNCTIONS/AGGREGATES/TYPES ) em sua saída. Fazer grep dessas instruções do pg_dump stdout substituindo new USER/SCHEMANAME por sed e, em seguida, devolvendo essas instruções para o cliente psql corrigirá as coisas, mesmo que o objeto seja de propriedade do usuário Postgres. Eu usei a mesma abordagem no script e permiti que o usuário passasse NEW USER NAME e SCHEMA NAME, para substituí-lo na instrução ALTER…OWNER TO...
Uso e saída de 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
Você pode baixar o script aqui, e também há README para ajudá-lo no uso.