Debido a que los roles pueden ser propietarios de objetos de base de datos y pueden tener
privilegios para acceder a otros objetos, eliminar un rol a menudo no es sólo cuestión de
un rápido DROP ROLE. Cualquier objeto
propiedad del rol debe ser eliminado primero o reasignado a otros propietarios; y cualquier
permiso concedido al rol debe ser revocado.
La propiedad de los objetos se puede transferir uno a la vez usando comandos
ALTER, por ejemplo:
ALTER TABLE bobs_table OWNER TO alice;
Alternativamente, se puede utilizar el comando REASSIGN OWNED
para reassignar la propiedad de todos los objetos que pertenecen al rol que se va a eliminar
a otro rol único. Dado que REASSIGN OWNED no puede acceder a objetos
en otras bases de datos, es necesario ejecutarlo en cada base de datos que contenga objetos
propiedad del rol. (Ten en cuenta que el primer REASSIGN OWNED de este tipo
cambiará la propiedad de cualquier objeto compartido entre bases de datos, es decir, bases de datos
o tablespaces, que sean propiedad del rol que se va a eliminar).
Una vez que los objetos valiosos han sido transferidos a nuevos propietarios, cualquier objeto
restante propiedad del rol que se va a eliminar se puede eliminar con el comando DROP OWNED. Nuevamente, este comando no puede
acceder a objetos en otras bases de datos, por lo que es necesario ejecutarlo en cada base
de datos que contenga objetos propiedad del rol. Además, DROP OWNED no
eliminará bases de datos completas o tablespaces, por lo que es necesario hacerlo manualmente
si el rol posee bases de datos o tablespaces que no han sido transferidos a nuevos propietarios.
DROP OWNED también se encarga de eliminar cualquier privilegio otorgado al
rol de destino para objetos que no le pertenecen. Debido a que REASSIGN OWNED
no toca tales objetos, normalmente es necesario ejecutar tanto REASSIGN OWNED
y DROP OWNED (¡en ese orden!) para eliminar por completo las dependencias de
un rol que se va a eliminar.
En resumen, la receta más general para eliminar un rol que se ha utilizado para poseer objetos es:
REASSIGN OWNED BY doomed_role TO successor_role; DROP OWNED BY doomed_role; -- repite los comandos anteriores en cada base de datos del clúster DROP ROLE doomed_role;
Cuando no todos los objetos propiedad se van a transferir al mismo propietario sucesor, lo mejor es manejar las excepciones manualmente y luego realizar los pasos anteriores para limpiar.
Si se intenta hacer DROP ROLE mientras aún quedan objetos dependientes,
se emitirán mensajes que identifican qué objetos deben reasignarse o eliminarse.