¿Cómo puedo solucionar el error «No se puede eliminar el usuario» en Amazon Redshift?
No puedo eliminar un usuario o un grupo en Amazon Redshift.
Breve descripción
Al intentar eliminar un usuario en Amazon Redshift, es posible que aparezca uno de los siguientes mensajes de error:
- ERROR: user «username» cannot be dropped because some objects depend on it
- ERROR: el «username» del usuario no se puede eliminar porque el usuario tiene privilegios en algún objeto
- ERROR: user «username» cannot be dropped because the user owns some object
Estos errores pueden producirse al intentar eliminar los siguientes tipos de usuarios:
- Un propietario o un usuario objetivo que tiene los permisos predeterminados.
- El propietario de cualquier objeto (como bases de datos, esquemas, tablas, vistas, procedimientos y bibliotecas).
- Un usuario que tiene permisos en relación con los objetos.
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.
Solución
Instalación de scripts para crear vistas
Descargue los scripts v_generate_user_grant_revoke_ddl.sql y v_find_dropuser_objs.sql del repositorio de GitHub de Laboratorios de AWS e instálelos. Las vistas para los scripts v_generate_user_grant_revoke_ddl.sql y v_find_dropuser_objs.sql scripts utilizan el esquema admin en su definición. Si no tiene un esquema admin en el clúster de Amazon Redshift, modifique la definición en un esquema existente. Como alternativa, cree un esquema admin.
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 intenta crear una nueva vista antes de eliminar la vista anterior, se mostrará el error not valid table.
Eliminación de un usuario
Siga estos pasos:
-
Realice una búsqueda por usuario para encontrar todos los permisos de usuario concedidos que desea 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: Para volver a conceder los permisos, debe ser un usuario con permisos en relación con el objeto. Además, debe tener derechos para otorgar permisos a otro usuario. Si no tiene permisos de concesión, puede volver a otorgar los permisos como superusuario.
-
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: Sustituya grantor por el nombre del usuario que concede los permisos. Sustituya grantee por el nombre del usuario que recibe los permisos.
Si su consulta no devuelve ningún registro o si el comando DROP USER no surte efecto, ejecute la siguiente 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;
La consulta anterior genera un listado de los permisos del usuario que debe revocar antes de poder eliminar el usuario. Revoque estos permisos antes de continuar con el siguiente paso.
-
Para comprobar si hay listas de control de acceso (ACL) en blanco, ejecute las siguientes consultas:
select * from pg_user where usename = '<username-to-be-dropped>'; select * from pg_default_acl where defacluser= <user-id>; select pg_get_iam_role_by_user('<user-name>');
Para recuperar el nombre y el ID del usuario, busque las entradas de columna usename y usesysid en la tabla PG_USER_INFO.
Nota: Si hay entradas de usuario en la tabla PG_DEFAULT_ACL, no podrá eliminar el usuario. -
Si el usuario sigue teniendo permisos en relación con algunos objetos, compruebe si tiene permisos assumerole:
select pg_get_iam_role_by_user('<user-name>');
Si el usuario tiene permisos assumerole, primero revoque assumerole de PUBLIC. A continuación, ejecute el siguiente comando para revocar username:
revoke assumerole on all from public for all; revoke assumerole on all from <user-name> for all;
-
(Opcional) Si el usuario sigue teniendo permisos sobre algunos objetos, compruebe si forma parte de otro grupo. Es posible que el usuario tenga permisos otorgados desde ese grupo. También puede ser que tenga permisos otorgados al grupo PUBLIC.
Para comprobar los permisos que el usuario tiene concedidos todavía, ejecute las siguientes consultas:select * from pg_user where usename = '<username-to-be-dropped>'; select * from pg_group;
En el resultado de la consulta pg_group, compruebe si hay entradas que contengan el usuario en la columna grolist. Si el usuario pertenece a otro grupo, su ID se mostrará en la lista. 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';
Nota: Sustituya objname y schemaname por su tabla y su esquema. De forma predeterminada, los permisos concedidos al grupo PUBLIC se otorgan a todos los usuarios.
-
Busque todos los objetos que pertenezcan al usuario y, a continuación, transfiera la propiedad a otro usuario o administrador distinto:
select ddl||'<newuser>;' as ddl from admin.v_find_dropuser_objs where objowner = '<username-to-be-dropped>';
El resultado del comando anterior muestra un listado de los comandos que debe usar para transferir la propiedad a otro usuario nuevo.
-
Repita los pasos del 2 al 7 en cada base de datos del clúster de Amazon Redshift.
-
Para eliminar el usuario de la base de datos, ejecute el siguiente comando:
drop user <username-to-be-dropped>;
Eliminación de un grupo
Nota: Antes de eliminar un grupo, debe revocar todos los permisos sobre objetos que tenga el grupo.
Siga estos pasos:
-
Busque todos los permisos otorgados al grupo y revóquelos:
select ddl from admin.v_generate_user_grant_revoke_ddl where ddltype='revoke' and grantee= 'group <group-name>';
-
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.
-
Ejecute el comando DROP GROUP para eliminar el grupo de usuarios.
Contenido relevante
- Como solucionar el error: Supplied Policy document is breaching Cloudwatch Logs policy length limit.Respuesta aceptadapreguntada hace 9 díaslg...
- preguntada hace un meslg...
- preguntada hace 23 díaslg...
- preguntada hace 12 díaslg...
- preguntada hace un meslg...
- OFICIAL DE AWSActualizada hace 2 años
- OFICIAL DE AWSActualizada hace 2 años
- OFICIAL DE AWSActualizada hace un año
- OFICIAL DE AWSActualizada hace un año