¿Cómo puedo solucionar el error «No se puede eliminar el usuario» en Amazon Redshift?

6 minutos de lectura
0

No puedo eliminar un usuario o un grupo en Amazon Redshift.

Descripción corta

Al intentar eliminar un usuario en Amazon Redshift, es posible que aparezca uno de estos mensajes de error:

  • ERROR: el «username» del usuario no se puede eliminar porque algunos objetos dependen de él
  • ERROR: el «username» del usuario no se puede eliminar porque el usuario tiene privilegios en algún objeto
  • ERROR: el «username» del usuario no se puede eliminar porque el usuario es propietario de algún objeto

Estos errores pueden producirse al intentar eliminar estos tipos de usuarios:

  • Propietario o usuario de destino de los privilegios predeterminados concedidos anteriormente.
  • Propietario de cualquier objeto (como bases de datos, esquemas, tablas, vistas, procedimientos y bibliotecas).
  • Usuario con privilegios sobre los objetos mencionados anteriormente.

Para solucionar estos mensajes de error, primero debe eliminar los permisos de los usuarios. A continuación, transfiera la propiedad de los objetos o elimine la propiedad de grupo de dichos objetos.

Importante: Debe revocar los permisos de usuarios y grupos de todas las bases de datos en el clúster de Amazon Redshift.

Resolución

Eliminar un usuario

Importante: Antes de eliminar a un usuario, revoque todos sus permisos. A continuación, transfiera la propiedad de cualquier objeto de base de datos que pertenezca al usuario.

1.    Descargue e instale los scripts v_generate_user_grant_revoke_ddl.sql y v_find_dropuser_objs.sql del repositorio de GitHub de Laboratorios de AWS. Estos scripts crean vistas en Amazon Redshift que son útiles para los dos pasos siguientes.

Nota: Las vistas para los scripts v_generate_user_grant_revoke_ddl.sql y v_find_dropuser_objs.sql utilizan el esquema admin en su definición. Si no tiene un esquema admin creado en el clúster de Amazon Redshift, cree estas vistas en cualquier otro esquema ya existente. Para crear estas vistas en otro esquema, modifique la definición o cree un esquema de administración. Si hay algún cambio en las columnas de la definición de la vista, elimine la vista antes de crear una nueva vista y una nueva definición. Si ya existe una vista e intenta crear una nueva antes de eliminar la anterior, recibirá un error de «tabla no válida».

2.    Busque todos los permisos de usuario concedidos por el usuario que se deban eliminar. A continuación, vuelva a conceder esos permisos como otro usuario. Se recomienda que este usuario sea un superusuario.

select regexp_replace(ddl,grantor,'<superuser>') from v_generate_user_grant_revoke_ddl where grantor='<username>' and ddltype='grant' and objtype <>'default acl' order by objseq,grantseq;

Nota: El usuario que vuelva a otorgar los permisos debe tener permisos sobre el objeto. Este usuario debe tener derechos para otorgar permisos a otro usuario. Si no hay otros usuarios que puedan volver a otorgar permisos, puede hacerlo mediante un superusuario.

3.    Busque todos los permisos otorgados al usuario y revóquelos:

select ddl from v_generate_user_grant_revoke_ddl where ddltype='revoke' and (grantee='<username>' or grantor='<username>') order by objseq, grantseq desc;

Nota: Asegúrese de reemplazar otorgante y beneficiario por los nombres de los usuarios que pueden otorgar y recibir permisos, respectivamente.

Si la consulta no devuelve ningún registro o se produce un error al ejecutar el comando para eliminar un usuario, ejecute esta consulta:

select ddl from admin.v_generate_user_grant_revoke_ddl where ddltype='revoke' and ddl ilike '%<user-to-be-dropped>%' order by objseq, grantseq desc;

Esta consulta muestra un listado de los permisos del usuario que se deben revocar antes de poder eliminarlo. Revoque estos permisos antes de pasar al siguiente paso.

4.    Ejecute estas consultas para comprobar si hay listas de control de acceso (ACL) vacías:

select \* from pg\_user where usename = '<username-to-be-dropped>'; select \* from pg\_default\_acl where defacluser= <user-id>;

Para recuperar el nombre y el ID del usuario, busque las entradas de columna usename y usesysid en la tabla PG_USER.
Nota: No puede eliminar un usuario si hay entradas suyas en la tabla PG_DEFAULT_ACL.

5.    Si el usuario que se va a eliminar aún tiene permisos sobre algunos objetos, compruebe si se le otorgaron permisos para asumir roles. Para comprobarlo, ejecute esta consulta:

select pg\_get\_iam\_role\_by\_user('<user-name>');

Si ve permisos assumerole para el usuario que se debe eliminar, revóquelos con este comando:

revoke assumerole on all from <user-name> for all;

6.    (Opcional) Si el usuario que se va a eliminar sigue teniendo permisos sobre algunos objetos, compruebe si forma parte de otro grupo. Es posible que el usuario tenga permisos otorgados de ese grupo o que tenga permisos otorgados al grupo PUBLIC o a todos los usuarios.

Para confirmar qué permisos sigue teniendo otorgados el usuario, ejecute estas consultas:

select * from pg_user where usename = '<username-to-be-dropped>';select * from pg_group;

En el resultado de la segunda consulta, compruebe la columna grolist. Compruebe si hay entradas que contengan el usuario que se va a eliminar. Si el usuario que se va a eliminar pertenece a otro grupo, se mostrará su ID.

Si la columna grolist indica que el usuario forma parte de un grupo, compruebe los permisos otorgados a ese grupo:

select ddl from admin.v_generate_user_grant_revoke_ddl where ddltype='revoke' and grantee= 'group <group-name>' ;select * from admin.v_generate_user_grant_revoke_ddl where objname='timecards' and schemaname='postgres' and grantee='PUBLIC' and ddltype='revoke';

Asegúrese de reemplazar objname y schemaname por la tabla y el esquema respectivos.

Nota: De forma predeterminada, los permisos otorgados al grupo PUBLIC se otorgan a todos los usuarios.

7.    Busque todos los objetos que pertenezcan al usuario y, a continuación, transfiera la propiedad del usuario que quiere eliminar a otro usuario o administrador:

select ddl||'<newuser>;' as ddl from admin.v_find_dropuser_objs where objowner = '<username-to-be-dropped>';

Este resultado muestra un listado de los comandos que puede utilizar para transferir la propiedad a otro usuario. Asegúrese de ejecutar los comandos que aparecen en la lista.

8.    Repita los pasos del 2 al 7 en cada base de datos del clúster de Amazon Redshift.

9.    Utilice el comando DROP USER para eliminar el usuario de la base de datos:

drop user <username-to-be-dropped>;

Eliminar un grupo

Nota: Antes de eliminar un grupo, debe revocar todos los permisos sobre objetos que tenga este grupo.

1.     Descargue e instale los scripts v_generate_user_grant_revoke_ddl.sql y v_find_dropuser_objs.sql del repositorio de GitHub de Laboratorios de AWS. Estos scripts crean vistas en Amazon Redshift que son útiles para el siguiente paso.

Nota: Las vistas para los scripts v_generate_user_grant_revoke_ddl.sql y v_find_dropuser_objs.sql utilizan el esquema admin en su definición. Si no tiene un esquema admin creado en el clúster de Amazon Redshift, puede crear estas vistas en cualquier otro esquema ya existente. Para crear estas vistas en otro esquema, modifique la definición o cree un esquema de administración.

2.    Busque todos los permisos otorgados al grupo y, a continuación, revóquelos como se muestra en este ejemplo:

select ddl from admin.v_generate_user_grant_revoke_ddl where ddltype='revoke' and grantee= 'group <group-name>';

3.    Repita el paso 2 en cada base de datos del clúster de Amazon Redshift. Confirme que los permisos del grupo estén revocados en todas las bases de datos.

4.    Utilice el comando DROP GROUP para eliminar el grupo de usuarios.

Información relacionada

Notas de uso de DROP USER

Ejemplo de DROP GROUP

OFICIAL DE AWS
OFICIAL DE AWSActualizada hace 7 meses