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

Dernière mise à jour : 16/10/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 accorde les autorisations doit être un utilisateur qui dispose d'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 super-utilisateur.

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;

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;

Afin de supprimer un utilisateur, la table pg_default_acl ne doit comporter aucune entrée utilisateur.

Si la requête renvoie une entrée pour l'utilisateur, exécutez à nouveau la commande revoke :

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

5.    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 v_find_dropuser_objs where objowner = 'testuser1';

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

7.    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 ?