Passer au contenu

Comment résoudre l'erreur « Impossible de supprimer l'utilisateur » dans Amazon Redshift ?

Lecture de 6 minute(s)
0

Je n'arrive pas à supprimer un utilisateur ou un groupe dans Amazon Redshift.

Brève description

Lorsque vous essayez de supprimer un utilisateur dans Amazon Redshift, l’un des messages d’erreur suivants peut s’afficher :

  • ERROR: user "username" cannot be dropped because some objects depend on it
  • ERREUR : le « nom d'utilisateur » de l'utilisateur ne peut pas être supprimé car l'utilisateur a un privilège sur un objet
  • ERROR: user "username" cannot be dropped because the user owns some object

Ces erreurs peuvent se produire lorsque vous essayez de supprimer les types d’utilisateurs suivants :

  • Propriétaire ou utilisateur cible disposant d’autorisations par défaut.
  • Propriétaire de tout objet (comme les bases de données, schémas, tableaux, vues, procédures, et bibliothèques).
  • Utilisateur qui a des autorisations sur les objets.

Pour corriger ces messages d’erreur, supprimez d’abord toutes les autorisations utilisateur. Transférez ensuite la propriété des objets ou supprimez la propriété collective des objets.

Important : Vous devez révoquer les autorisations des utilisateurs et des groupes sur toutes les bases de données du cluster Amazon Redshift. Pour afficher la liste des bases de données du cluster, exécutez la commande SHOW DATABASES. Pour afficher le nom de la base de données à laquelle vous êtes connecté, exécutez la commande CURRENT_DATABASE.

Résolution

Installer des scripts pour créer des vues

En tant que super-utilisateur, téléchargez et installez les scripts v_generate_user_grant_revoke_ddl.sql et v_find_dropuser_objs.sql depuis le référentiel AWS Labs sur le site Web de GitHub. Les vues des scripts v_generate_user_grant_revoke_ddl.sql et v_find_dropuser_objs.sql utilisent le schéma administrateur dans leur définition. Si vous ne disposez pas d’un schéma administrateur sur le cluster Amazon Redshift, modifiez la définition dans un schéma existant. Vous pouvez également créer un schéma administrateur.

Si vous modifiez des colonnes dans votre définition de vue, supprimez votre vue existante avant de créer une nouvelle vue et une nouvelle définition. Lorsque vous créez une nouvelle vue avant de supprimer l’ancienne, une erreur table non valide s’affiche.

Supprimer un utilisateur

Procédez comme suit :

  1. Ouvrez l'éditeur de requête v2. Recherchez ensuite l'utilisateur que vous souhaitez supprimer pour afficher les autorisations utilisateur accordées.

  2. Pour accorder de nouveau les autorisations à un autre utilisateur, exécutez la commande suivante :

    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;

    Remarque : pour accorder de nouveau les autorisations, vous devez être un utilisateur disposant d’autorisations sur l’objet. Vous devez également avoir accordé des droits d’autorisation à un autre utilisateur. Si vous ne disposez pas d’autorisations d’octroi, vous pouvez les accorder de nouveau en tant que super-utilisateur.

  3. Après avoir accordé de nouveau les autorisations à un autre utilisateur, exécutez la commande suivante pour révoquer les autorisations de l'utilisateur :

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

    Remarque : Remplacez grantor par le nom de l’utilisateur qui accorde les autorisations. Remplacez grantee par le nom de l’utilisateur qui reçoit les autorisations.
    Si votre requête ne renvoie aucun enregistrement ou si la commande DROP USER échoue, exécutez la commande 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;

    La requête précédente répertorie toutes les autorisations supplémentaires que vous devez révoquer de l'utilisateur. Révoquez ces autorisations.

  4. Pour vérifier la présence de listes de contrôle d’accès (ACL) vides, exécutez les requêtes suivantes :

    select * from pg_user where username = 'username-to-be-dropped';   
    select * from pg_default_acl where defacluser= user-id;
    select pg_get_iam_role_by_user('user-name');

    Remarque : Remplacez username-to-be-dropped et user-name par vos valeurs. Pour récupérer le nom et l’ID de l’utilisateur, recherchez les entrées des colonnes usename et usesysid dans la table PG_USER_INFO. Si la table PG_DEFAULT_ACL contient des entrées utilisateur, vous ne pourrez pas supprimer l’utilisateur.

  5. Si l’utilisateur dispose toujours d’autorisations sur des objets, vérifiez s’il possède l’autorisation assumerole :

    select pg_get_iam_role_by_user('user-name');

    Si l’utilisateur dispose de l’autorisation assumerole, révoquez d’abord son autorisation assumerole du public. Exécutez ensuite la commande suivante pour révoquer username :

    revoke assumerole on all from public for all;  
    revoke assumerole on all from user-name for all;
  6. (Facultatif) Si l’utilisateur a toujours des autorisations sur certains objets, vérifiez s’il fait partie d’un autre groupe. L’utilisateur peut avoir des autorisations accordées par ce groupe. Il se peut également que l’utilisateur dispose d’autorisations accordées au groupe PUBLIC.
    Pour vérifier les autorisations que l'utilisateur possède toujours, exécutez les requêtes suivantes :

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

    Dans la sortie de la requête pg_group, vérifiez si certaines entrées répertorient bien l’utilisateur dans la colonne grolist. Si l'utilisateur appartient à un autre groupe, la colonne grolist affiche son ID d’utilisateur. Pour vérifier les autorisations d'un groupe, exécutez la commande suivante :

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

    Remarque : Remplacez objname et schemaname par votre table et votre schéma. Par défaut, Amazon Redshift octroie les autorisations accordées au groupe PUBLIC à tous les utilisateurs.

  7. Recherchez tous les objets appartenant à l’utilisateur, puis transférez la propriété à un autre utilisateur ou à administrateur :

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

    Le résultat de la commande précédente répertorie les commandes que vous devez utiliser pour les transférer à un nouvel utilisateur.

  8. Répétez les étapes 2 à 7 dans chaque base de données du cluster Amazon Redshift.
    Remarque : Pour répertorier vos bases de données, exécutez la commande SHOW DATABASES.

  9. Pour supprimer l’utilisateur de la base de données, exécutez la commande suivante :

    drop user username-to-be-dropped;

Supprimer un groupe

Remarque : avant de supprimer un groupe, vous devez révoquer toutes les autorisations sur les objets dont dispose le groupe.

Procédez comme suit :

  1. Recherchez toutes les autorisations accordées au groupe, puis révoquez-les :

    select ddl from admin.v_generate_user_grant_revoke_ddl where ddltype='revoke' and grantee= 'group group-name';
  2. Répétez l'étape 1 dans chaque base de données du cluster Amazon Redshift pour révoquer les autorisations du groupe dans toutes les bases de données.

  3. Utilisez la commande DROP GROUP pour supprimer le groupe d’utilisateurs.

AWS OFFICIELA mis à jour il y a 9 mois