PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Como alterar a propriedade de todos os objetos em um esquema específico no PostgreSQL?

Algumas sugestões aqui (Obrigado), me inspiraram a compor um script bash para alterar todos os (TABELAS / SEQUÊNCIAS / VISUALIZAÇÕES / FUNÇÕES / AGREGADOS / TIPOS) propriedade em um esquema específico de uma só vez. Nenhum código especial incluído em um script, basicamente escolhi a técnica sugerida e simplifiquei o método de implementação via script. Na verdade, o comando REASSIGN OWNED BY faz a maior parte do trabalho sem problemas, no entanto, ele altera a propriedade de objetos em todo o banco de dados, independentemente de qualquer esquema. Duas eventualidades, onde você não pode usar REASSIGN OWNED BY:

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.