21.4. Eliminación de roles #

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.