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 : 12/11/2021

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 dans Amazon Redshift, il est possible que l'un des messages d'erreur suivants s'affiche :

ERROR: user "username" cannot be dropped because some objects depend on it
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

Ces erreurs peuvent se produire si vous essayez de supprimer les types d'utilisateurs suivants :

  • Propriétaire ou utilisateur cible des privilèges par défaut précédemment accordés.
  • Propriétaire d'objets (tels que bases de données, schémas, tables, vues, procédures et bibliothèques).
  • L'utilisateur dispose de privilèges sur les objets mentionnés précédemment.

Pour ne plus recevoir ces message d'erreur, 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.

Important : 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 les scripts v_generate_user_grant_revoke_ddl.sql et v_find_dropuser_objs.sql à partir du référentiel GitHub AWS Labs. Ces scripts créent des vues dans Amazon Redshift qui sont utiles pour les deux étapes suivantes.

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. Pour créer ces vues dans un autre schéma, modifiez la définition ou créez un schéma d'administrateur. Notez que s'il existe des modifications de colonne dans votre définition de vue, vous devez supprimer votre vue avant de créer une vue et une définition. Si une vue existe déjà et que vous essayez d'en créer une sans supprimer l'ancienne, vous recevez une erreur de définition de table non valide.

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

select ddl, grantor, grantee from admin.v_generate_user_grant_revoke_ddl where grantee='<username-to-be-dropped>' 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 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='<username-to-be-dropped>' order by objseq, grantseq desc;

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

Si votre requête ne renvoie aucun enregistrement ou que la commande drop user échoue, exécutez la requête suivante :

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;

Cette requête répertorie les autorisations qui doivent être retirées à l'utilisateur pour que celui-ci puisse être supprimé. Veillez à retirer ces autorisations avant de passer à l'étape suivante.

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 = '<username-to-be-dropped>'; 
select * from pg_default_acl where defacluser= <user-id>;

Pour récupérer le nom et l'ID utilisateur, recherchez les entrées de colonne usename et usesysid dans la table PG_USER.

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

5.    (Facultatif) Si l'utilisateur à supprimer dispose toujours d'autorisations sur certains objets, vérifiez si il fait partie d'un autre groupe. L'utilisateur peut disposer d'autorisations accordées par ce groupe. Il est également possible que l'utilisateur dispose d'autorisations qui ont été accordées au groupe PUBLIC (ou à tous les utilisateurs).

Pour vérifier les autorisations qui sont toujours accordées à l'utilisateur, exécutez les requêtes suivantes :

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

Dans la sortie de la deuxième requête, vérifiez la colonne grolist et qu'il existe des entrées répertoriant l'utilisateur à supprimer. Si l'utilisateur à supprimer appartient à un autre groupe, son ID sera répertorié.

Si votre colonne grolist indique que l'utilisateur fait partie d'un groupe, vérifiez alors les autorisations accordées à ce groupe :

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';

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.

6.    Recherchez tous les objets que possède l'utilisateur, puis transférez la propriété de l'utilisateur supprimé à un autre utilisateur ou administrateur :

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

Cette sortie répertorie les commandes que vous pouvez utiliser pour transférer la propriété à un nouvel utilisateur. Veillez à exécuter les commandes qui sont répertoriées.

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

8.    Utilisez la commande DROP USER pour supprimer l'utilisateur de la base de données :

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

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 GitHub AWS Labs. 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 grantee= 'group <group-name>';

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 ?