Como as funções de banco de dados (roles) podem possuir objetos de banco de dados, e podem ter privilégios para acessar outros objetos, remover uma função de banco de dado geralmente não é apenas uma questão de executar o comando DROP ROLE rapidamente. Quaisquer objetos pertencentes à função de banco de dados devem primeiro ser removidos ou reatribuídos a outros donos; e todos os privilégio concedidos à função de banco de dados devem ser revogados.
A posse dos objetos pode ser transferida uma de cada vez usando
comandos ALTER. Por exemplo:
ALTER TABLE tabela_do_bob OWNER TO alice;
Como alternativa, pode ser usado o comando
REASSIGN OWNED para reatribuir a posse de
todos os objetos pertencentes à função de banco de dados a ser
removida para uma única outra função de banco de dados.
Como o comando REASSIGN OWNED não pode acessar
objetos em outros bancos de dados, é necessário executá-lo em cada
banco de dados que contém objetos pertencentes à função de banco
de dados a ser removida.
(Note-se que o primeiro comando REASSIGN OWNED irá
alterar a posse de quaisquer objetos compartilhados entre bancos de
dados, ou seja, bancos de dados ou espaços de tabelas pertencentes
à função de banco de dados a ser removida.)
Uma vez que quaisquer objetos valiosos tenham sido transferidos
para os novos donos, quaisquer objetos remanescentes pertencentes
à função de banco de dados a ser removida podem ser removidos
pelo comando DROP OWNED.
Novamente, este comando não pode acessar objetos em outros bancos
de dados, portanto é necessário executá-lo em cada banco de dados
que contém objetos pertencentes à função de banco de dados a ser
removida.
Além disso, o comando DROP OWNED não irá eliminar
bancos de dados ou espaços de tabelas inteiros, portanto,
é necessário fazer isto manualmente se a função possuir quaisquer
bancos de dados ou espaço de tabelas que não foram transferidos
para os novos donos.
O comando DROP OWNED também se encarrega de
remover quaisquer privilégios concedidos à função de banco de dados
sucessora para os objetos que não pertencem a ela.
Como o comando REASSIGN OWNED não toca nesses
objetos, normalmente é necessário executar o comando
REASSIGN OWNED e DROP OWNED
(nesta ordem!) para remover inteiramente as dependências da
função de banco de dados a ser removida.
Em resumo, a receita mais geral para remover uma função de banco de dados usada para possuir objetos é:
REASSIGN OWNED BY role_removida TO role_sucessora; DROP OWNED BY role_removida; -- repetir os comandos acima em cada banco de dados da instância DROP ROLE role_removida;
Quando nem todos os objetos possuídos devem ser transferidos para o mesmo dono sucessor, é melhor lidar com as exceções manualmente e, em seguida, executar as etapas acima para fazer a limpeza.
Se for usado o comando DROP ROLE enquanto os
objetos dependentes ainda existirem, serão emitidas mensagens
identificando quais objetos precisam ser reatribuídos ou removidos.