¿Por qué no puedo eliminar un usuario o rol en mi instancia de base de datos de RDS para PostgreSQL?

Última actualización: 07-07-2022

Cuando intento eliminar un usuario o rol en mi instancia de Amazon Relational Database Service (Amazon RDS) para PostgreSQL, aparece el error “role cannot be dropped because some objects depend on it” (no se puede eliminar el rol porque algunos objetos dependen de él).

Descripción corta

Cuando un usuario o rol en RDS para PostgreSQL crea un objeto, como una tabla o un esquema, el usuario o el rol es el propietario del objeto creado. Si intenta eliminar un usuario o rol que posee uno o más objetos en cualquier base de datos o tiene privilegios respecto a estos objetos, recibirá un error que indica que hay objetos que dependen del usuario o rol junto con los permisos concedidos, si los hay.

Para eliminar un usuario o rol que tiene objetos dependientes, debe hacer lo siguiente:

  1. Reasigne la propiedad de estos objetos a otro usuario.
  2. Revoque todos los permisos que se hayan concedido al usuario o al rol.

Nota: Si estos objetos ya no son necesarios, considere la posibilidad de eliminarlos y, a continuación, eliminar el rol. Puede eliminar todos los objetos que son propiedad de un rol en una base de datos mediante el comando DROP OWNED. También puede revocar los privilegios concedidos al rol en los objetos de esa base de datos o los objetos compartidos. Una vez que el comando DROP OWNED se ejecute correctamente, puede eliminar la función.

Resolución

En el siguiente ejemplo, se utilizan tres roles de base de datos diferentes:

  • test_user: este es el usuario o rol que se debe eliminar.
  • admin_user: este es el rol que se usa para eliminar el usuario o el rol requeridos. Este usuario es el usuario con más privilegios en RDS con el rol rds_superuser asociado.
  • another_user: este es el usuario o rol al que se le asigna la propiedad de los objetos que son propiedad de test_user.

Ejecute el siguiente comando para ver el rol con el que inició sesión:

pg_example=> SELECT current_user;

La salida es similar a la siguiente:

current_user
--------------
 admin_user
(1 row)

Cuando intenta eliminar un usuario o rol con objetos dependientes, aparece un error similar al siguiente:

pg_example=> DROP ROLE test_user;
ERROR:  role "test_user" cannot be dropped because some objects depend on it
DETAIL:  privileges for database pg_example
owner of table test_table
owner of schema test_schema
owner of sequence test_schema.test_seq
privileges for table test_t2

En este ejemplo, el rol que se elimina es test_user. Tenga en cuenta que el rol el que se ha iniciado sesión actualmente es admin_user, que es el usuario maestro de la base de datos.

En el mensaje de error, se obtiene la siguiente información:

  • El rol test_user tiene privilegios concedidos en la base de datos pg_example y en la tabla test_t2.
  • El rol test_user es propietario de la tabla test_table, el esquema test_schema y un objeto de secuencia test_seq en test_schema.

Nota: Si elimina un usuario o rol cuando está conectado a una base de datos diferente, obtendrá un resultado similar al siguiente:

pg_another_db=> DROP ROLE test_user;
ERROR:  role "test_user" cannot be dropped because some objects depend on it
DETAIL:  privileges for database pg_example
4 objects in database pg_example

Para ver los objetos que son propiedad de un usuario o rol, asegúrese de conectarse a la base de datos en la que se encuentran los objetos que posee.

Para eliminar el usuario o la función, debe reasignar la propiedad de los objetos en propiedad a otro usuario o rol y revocar los permisos asociados. Puede usar el comando REASSIGN OWNED de PostgreSQL para reasignar la propiedad de estos objetos a otro usuario. Al ejecutar este comando, es posible que aparezca un error similar al siguiente:

pg_example=> select current_user;
 current_user
--------------
 test_user
pg_example=> REASSIGN OWNED BY test_user TO another_user;
ERROR:  permission denied to reassign objects

Para resolver este problema, debe conceder el usuario o rol al usuario que está reasignando la propiedad. No puede usar test_user para hacerlo porque test_user no es el propietario de another_user. Por lo tanto, es posible que aparezca un error similar al siguiente:

pg_example=> select current_user;
 current_user
--------------
 test_user
pg_example=> grant another_user to test_user;
ERROR:  must have admin option on role "another_user"

Puede realizar una de las siguientes acciones para conceder el usuario o el rol al usuario que está reasignando la propiedad:

  • Inicie sesión en su usuario maestro y ejecute el comando GRANT:
pg_example=> select current_user;
 current_user
--------------
 admin_user
pg_example=> GRANT another_user TO test_user;
GRANT ROLE
  • Inicie sesión con el usuario que va a reasignar la propiedad y ejecute el comando GRANT:
pg_example=> select current_user;
 current_user
--------------
 another_user
pg_example=> GRANT another_user TO test_user;
GRANT ROLE

Después de elegir una de las opciones anteriores, reasigne la propiedad de los objetos propiedad de test_user a another_user después de iniciar sesión en test_user:

pg_example=> select current_user;
 current_user
--------------
 test_user
pg_example=> reassign owned by test_user to another_user;
REASSIGN OWNED

Si inicia sesión en su usuario maestro e intenta eliminar un test_user que aún tiene privilegios existentes, puede que se produzca un error similar al siguiente:

pg_example=> select current_user;
 current_user
--------------
 admin_user
pg_example=> DROP ROLE test_user;
ERROR:  role "test_user" cannot be dropped because some objects depend on it
DETAIL:  privileges for database pg_example
privileges for table test_t2

En este caso, se produce un error aunque el comando REASSIGN se haya realizado correctamente. Esto se debe a que los privilegios de test_user deben revocarse. Ejecute el comando REVOKE para revocar todos los permisos de uso de cualquier objeto en el que test_user tenga privilegios. En este ejemplo, revoque los permisos de la base de datos pg_example y la tabla test_t2 para test_user.

pg_example=> REVOKE ALL ON TABLE test_t2 FROM test_user;
REVOKE
pg_example=> REVOKE ALL ON DATABASE pg_example FROM test_user;
REVOKE

A continuación, elimine el usuario test_user:

pg_example=> DROP ROLE test_user;
DROP ROLE

Después de revocar los privilegios, podrá eliminar el rol correctamente.


Documentación de PostgreSQL para DROP ROLE

¿Le resultó útil este artículo?


¿Necesita asistencia técnica o con la facturación?