Comment résoudre l'erreur « user cannot be dropped » (l'utilisateur ne peut pas être supprimé) dans Amazon Redshift ?

Date de la dernière mise à jour : 23/12/2020

Je ne parviens pas à supprimer un utilisateur ou un groupe dans Amazon Redshift. Comment résoudre ce problème ?

Brève description

Lorsque vous essayez de supprimer un utilisateur ou un groupe dans Amazon Redshift, il est possible que vous rencontriez l'un des messages d'erreur suivants :

ERROR: user 'username' cannot be dropped because the user has a privilege on some object

ERROR: user 'username' cannot be dropped because the user owns some object

Pour ne plus recevoir ce type de message, vous devez d'abord supprimer les autorisations des utilisateurs et transférer la propriété des objets, ou supprimer la propriété détenue par le groupe sur ces objets.

Remarque : vous devez révoquer les autorisations des utilisateurs et des groupes de toutes les bases de données du cluster Amazon Redshift.

Résolution

Suppression d'un utilisateur

Important : avant de supprimer un utilisateur, révoquez les autorisations des utilisateurs. Transférez ensuite la propriété de tous les objets de base de données que possède l'utilisateur.

1.    Téléchargez et installez le script v_generate_user_grant_revoke_ddl.sql à partir du référentiel AWSLabs GitHub. Le script v_generate_user_grant_revoke_ddl.sql crée une vue dans Amazon Redshift qui sera utile pour les deux prochaines étapes.

Remarque : les vues des scripts v_generate_user_grant_revoke_ddl.sql et v_find_dropuser_objs.sql utilisent le schéma d'administrateur dans leur définition. Si aucun schéma d'administrateur n'est créé sur le cluster Amazon Redshift, vous pouvez créer ces vues dans n'importe quel autre schéma existant. Afin de créer ces vues dans un autre schéma, modifiez la définition ou créez un schéma d'administrateur.

2.    Recherchez toutes les autorisations, qui ont été supprimées, dont bénéficie l'utilisateur, puis réattribuez-les à un autre utilisateur :

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

Remarque : l'utilisateur qui rétablit les autorisations doit être un utilisateur avec des autorisations sur l'objet. Cet utilisateur doit également être en mesure d'attribuer des autorisations à un autre utilisateur. S'il n'y a pas d'autres utilisateurs avec des autorisations de réattribution, vous pouvez les réattribuer en tant que superutilisateur.

3.    Recherchez toutes les autorisations attribuées à l'utilisateur, puis révoquez-les :

select ddl from admin.v_generate_user_grant_revoke_ddl where ddltype='revoke' and (grantee='testuser1' or grantor='aws') order by objseq, grantseq desc;

Assurez-vous de remplacer « concédant » et « bénéficiaire » par les noms d'utilisateur qui peuvent accorder et recevoir des autorisations, respectivement.

4.    Exécutez les requêtes suivantes pour rechercher les listes de contrôle d'accès (ACL) vides :

select * from pg_user where usename = 'testuser1';
select * from pg_default_acl where defacluser= 108;

Remarque : pour supprimer un utilisateur, il ne peut pas y avoir d'entrées utilisateur dans la table PG_DEFAULT_ACL.

5.    (Facultatif) Si la requête renvoie une entrée pour l'utilisateur, exécutez à nouveau la commande révocation :

select ddl from admin.v_generate_user_grant_revoke_ddl where ddltype='revoke' and (grantee='testuser1' or grantor='aws') order by objseq, grantseq desc;

Vérifiez si toutes les autorisations accordées à l'utilisateur ont été révoquées :

select * from pg_user where usename = 'testuser1';
select * from pg_group;

Dans la sortie de la requête, vérifiez la colonne grolist pour vérifier si l'utilisateur (testuser1) appartient à un autre groupe.

6.    (Facultatif) Si votre colonne grolist indique que testuser1 fait partie d'un groupe, vérifiez les autorisations accordées à ce groupe :

select ddl from admin.v_generate_user_grant_revoke_ddl where ddltype='revoke' and (grantee='group-name') order by objseq, grantseq desc;

7.    (Facultatif) Si la table PG_DEFAULT_ACL affiche toujours des entrées, vérifiez si des autorisations ont été accordées au groupe PUBLIC :

select * from admin.v_generate_user_grant_revoke_ddl where objname='timecards' and schemaname='postgres' and grantee='PUBLIC' and ddltype='revoke';

Assurez-vous de remplacer objname et schemaname par votre table et schéma respectifs.

Remarque : par défaut, les autorisations accordées au groupe PUBLIC sont accordées à tous les utilisateurs.

8.    Recherchez tous les objets que possède l'utilisateur, puis transférez la propriété de l'utilisateur supprimé à un administrateur ou à un utilisateur différent. Dans l'exemple suivant, username est le propriétaire actuel et newuser est le nouveau propriétaire :

select ddl||'<newuser>;' as ddl from admin.v_find_dropuser_objs where objowner = 'testuser1';

9.    Répétez les étapes 2 à 8 dans chaque base de données du cluster Amazon Redshift.

10.    Utilisez la commande DROP USERpour supprimer l'utilisateur de la base de données :

drop user testuser1;

Suppression d'un groupe

Avant de supprimer un groupe, vous devez révoquer toutes les autorisations dont dispose le groupe sur des objets.

1.    Téléchargez et installez les scripts v_generate_user_grant_revoke_ddl.sql et v_find_dropuser_objs.sql à partir du référentiel AWSLabs GitHub. Ces scripts créent des vues dans Amazon Redshift qui sont utiles pour l'étape suivante.

Remarque : les vues des scripts v_generate_user_grant_revoke_ddl.sql et v_find_dropuser_objs.sql utilisent le schéma d'administrateur dans leur définition. Si aucun schéma d'administrateur n'est créé sur le cluster Amazon Redshift, vous pouvez créer ces vues dans n'importe quel autre schéma existant. Afin de créer ces vues dans un autre schéma, modifiez la définition ou créez un schéma d'administrateur.

2.    Recherchez toutes les autorisations attribuées au groupe, puis révoquez-les, comme illustré dans l'exemple suivant :

select ddl from admin.v_generate_user_grant_revoke_ddl where ddltype='revoke' and username='<groupname>' order by sequence;

3.    Répétez l'étape 2 dans chaque base de données du cluster Amazon Redshift, en vérifiant que les autorisations du groupe sont révoquées dans toutes les bases de données.

4.    À l'aide de la commande DROP GROUP, supprimez le groupe d'utilisateurs.


Cet article vous a-t-il été utile ?


Besoin d'aide pour une question technique ou de facturation ?