Comment résoudre l'erreur « Impossible de supprimer l'utilisateur » dans Amazon Redshift ?
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.
Résolution
Installation de scripts pour créer des vues
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 GitHub d’AWS Labs. 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.
En cas de modification de colonnes dans votre définition de vue, supprimez cette dernière avant de créer une nouvelle vue et une nouvelle définition. Si vous essayez de créer une nouvelle vue avant de supprimer l’ancienne, vous recevrez une notification signalant l’erreur not valid table.
Supprimer un utilisateur
Procédez comme suit :
-
Effectuez une recherche par utilisateur pour trouver toutes les autorisations utilisateur accordées que vous souhaitez supprimer. Accordez ensuite les autorisations à un autre utilisateur. Il est recommandé que cet utilisateur soit un super-utilisateur :
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.
-
Trouvez toutes les autorisations accordées à l’utilisateur, puis révoquez-les :
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 personne qui accorde l’autorisation par le nom de l’utilisateur qui accorde les autorisations. Remplacez personne qui bénéficie de l’autorisation 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 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;
La requête précédente répertorie les autorisations de l’utilisateur que vous devez révoquer avant de pouvoir le supprimer. Révoquez ces autorisations avant de passer à l’étape suivante.
-
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 usename = '<username-to-be-dropped>'; select * from pg_default_acl where defacluser= <user-id>; select pg_get_iam_role_by_user('<user-name>');
Pour récupérer le nom et l’identifiant de l’utilisateur, recherchez les entrées des colonnes usename et usesysid dans le tableau PG_USER_INFO.
Remarque : si le tableau PG_DEFAULT_ACL contient des entrées utilisateur, vous ne pourrez pas supprimer l’utilisateur. -
Si l’utilisateur possède toujours des autorisations sur certains objets, vérifiez s’il a l’autorisation assumerole :
select pg_get_iam_role_by_user('<user-name>');
Si l’utilisateur a 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;
-
(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 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 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, son nom d’utilisateur sera répertorié. Vérifiez 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';
Remarque : remplacez objname et schemaname par votre tableau et votre schéma. Par défaut, les autorisations accordées au groupe PUBLIC sont accordées à tous les utilisateurs.
-
Recherchez tous les objets appartenant à l’utilisateur, puis transférez les à 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.
-
Répétez les étapes 2 à 7 dans chaque base de données du cluster Amazon Redshift.
-
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 :
-
Trouvez 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>';
-
Répétez l’étape 2 dans chaque base de données du cluster Amazon Redshift. Confirmez que les autorisations du groupe sont révoquées dans toutes les bases de données.
-
Utilisez la commande DROP GROUP pour supprimer le groupe d’utilisateurs.
Contenus pertinents
- demandé il y a 2 anslg...
- demandé il y a 23 jourslg...
- Réponse acceptéedemandé il y a un anlg...
- demandé il y a un anlg...
- demandé il y a 5 moislg...
- AWS OFFICIELA mis à jour il y a 2 ans
- AWS OFFICIELA mis à jour il y a un an
- AWS OFFICIELA mis à jour il y a un an
- AWS OFFICIELA mis à jour il y a 2 ans