21.4. Remoção de função de banco de dados #

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.