Removendo roles no PostgreSQL
Publicado por jotacomm em 25/10/2008
Olá, pessoal
Vou falar um pouco sobre a remoção de roles no PostgreSQL. Para remover um role conteiner ou login usamos o comando DROP ROLE.
Sintaxe completa: DROP ROLE [ IF EXISTS ] name [, ...].
Observação: A opção IF EXISTS está disponível a partir da versão 8.2 e é opcional.
Quando queremos remover uma role ou uma lista de roles podemos fazer:
DROP ROLE IF EXISTS role1;
ou
DROP ROLE role1;
DROP ROLE IF EXISTS role1,role2,role3;
ou
DROP ROLE role1,role2,role3;
O IF EXISTS verifica se a role existe. Se sim, remove a role. Caso contrário apresenta uma mensagem informando que a role não existe. Sem essa verificação seria apresentada uma mensagem de erro.
Vamos a prática:
foo=# DROP ROLE jotacomm;
DROP ROLE
Porém, em alguns casos pode ser gerado o seguinte erro:
DROP ROLE foo;
ERROR: role “foo” cannot be dropped because some objects depend on it
DETAIL: owner of table tabela2
owner of table tabela1
O erro apresentado acima indica que a role não pode ser excluída pois existem objetos que ela é dona (OWNER).
E como proceder nesta situação? Uma solução seria atribuir a propriedade do objeto para outra role. Por exemplo:
ALTER TABLE tabela1 OWNER TO bar;
ALTER TABLE tabela2 OWNER TO bar;
Depois da alteração é possível remover a role. No entanto, essa solução não é a mais adequada pelo fato de que se a role possuir vários objetos como: tabelas, seqüências, funções, esquemas dentre outros objetos este processo deve ser realizado para todos estes objetos.
Então podemos utilizar os comandos DROP OWNED ou REASSIGN OWNED. O DROP OWNED remove todos os objetos de propriedade de uma ou mais roles enquanto que o comando REASSIGN OWNED transfere a propriedade dos objetos de uma ou mais roles para uma outra role.
Os comandos DROP OWNED e REASSIGN OWNED estão disponíveis a partir da versão 8.2.
Sintaxe completa:
DROP OWNED BY name [, ...] [ CASCADE | RESTRICT ]
REASSIGN OWNED BY old_role [, ...] TO new_role
Dessa forma o processo fica mais fácil e rápido. Tá, mas como funciona isso na prática?
Exemplo do uso do DROP OWNED.
foo=# DROP OWNED BY foo;
DROP OWNED
Como a execução do comando DROP OWNED todos os objetos da role foo foram deletados.
Então agora eu posso usar o DROP ROLE para remover a role.
foo=# DROP ROLE foo;
DROP ROLE
Exemplo do uso do REASSIGN OWNED.
foo=# REASSIGN OWNED BY bar TO postgres;
REASSIGN OWNED
Como a execução do comando REASSIGN OWNED todos os objetos de propriedade da role bar foram transferidos para a role postgres.
Então agora eu posso usar o DROP ROLE para remover a role.
foo=# DROP ROLE bar;
DROP ROLE
Fiquem a vontade para comentários.
[]s