Pourquoi ne puis-je pas supprimer un utilisateur ou un rôle dans mon instance DB RDS pour PostgreSQL ?

Lecture de 6 minute(s)
0

Lorsque j'essaie de supprimer un utilisateur ou un rôle dans mon instance Amazon Relational Database Service (Amazon RDS) pour PostgreSQL, j'obtiens l'erreur « role cannot be dropped because some objects depend of it » (le rôle ne peut pas être supprimé car des objets en dépendent).

Brève description

Lorsqu'un utilisateur ou un rôle dans RDS pour PostgreSQL crée un objet, tel qu'une table ou un schéma, l'utilisateur ou le rôle est le propriétaire de l'objet créé. Si vous essayez de supprimer un utilisateur ou un rôle qui possède un ou plusieurs objets dans une base de données ou qui possède des privilèges sur ces objets, vous recevez un message d'erreur indiquant que certains objets dépendent de l'utilisateur ou du rôle, ainsi que des autorisations accordées, le cas échéant.

Pour supprimer un utilisateur ou un rôle qui possède des objets dépendants, vous devez procéder comme suit :

  1. Réattribuez la propriété de ces objets à un autre utilisateur.
  2. Révoquez toutes les autorisations accordées à l'utilisateur ou au rôle.

Remarque : si ces objets ne sont plus nécessaires, pensez à les supprimer puis à supprimer le rôle. Vous pouvez supprimer tous les objets appartenant à un rôle dans une base de données à l'aide de la commande DROP OWNED. Vous pouvez également révoquer tous les privilèges accordés au rôle sur les objets de cette base de données ou les objets partagés. Une fois la commande DROP OWNED exécutée, vous pouvez supprimer le rôle.

Solution

Dans l'exemple suivant, trois rôles de base de données différents sont utilisés :

  • test_user : il s'agit de l'utilisateur ou du rôle qui doit être supprimé.
  • admin_user : il s'agit du rôle utilisé pour supprimer l'utilisateur ou le rôle requis. Cet utilisateur est l'utilisateur disposant des privilèges les plus élevés dans RDS auquel est attaché le rôle rds_superuser.
  • another_user : il s'agit de l'utilisateur ou du rôle auquel la propriété des objets appartenant à test_user est attribuée.

Exécutez la commande suivante pour voir le rôle avec lequel vous vous êtes connecté :

pg_example=> SELECT current_user;

Le résultat est similaire à ce qui suit :

current_user
--------------
 admin_user
(1 row)

Lorsque vous essayez de supprimer un utilisateur ou un rôle avec des objets dépendants, vous obtenez une erreur similaire à la suivante :

pg_example=> DROP ROLE test_user;
ERROR:  role "test_user" cannot be dropped because some objects depend on it
DETAIL:  privileges for database pg_example
owner of table test_table
owner of schema test_schema
owner of sequence test_schema.test_seq
privileges for table test_t2

Dans cet exemple, le rôle supprimé est test_user. Notez que le rôle actuellement connecté est admin_user, qui est l'utilisateur principal de la base de données.

Le message d'erreur affiche les informations suivantes :

  • Le rôle test_user dispose de privilèges accordés sur la base de données pg_example et la table test_t2.
  • Le rôle test_user possède la table test_table, le schéma test_schema et un objet de séquence test_seq dans test_schema.

Remarque : si vous supprimez un utilisateur ou un rôle lorsque vous êtes connecté à une autre base de données, vous obtenez un résultat similaire au suivant :

pg_another_db=> DROP ROLE test_user;
ERROR:  role "test_user" cannot be dropped because some objects depend on it
DETAIL:  privileges for database pg_example
4 objects in database pg_example

Pour voir les objets appartenant à un utilisateur ou à un rôle, assurez-vous de vous connecter à la base de données dans laquelle se trouvent les objets possédés.

Pour supprimer l'utilisateur ou le rôle, vous devez réattribuer la propriété des objets possédés à un autre utilisateur ou rôle et révoquer les autorisations associées. Vous pouvez utiliser la commande PostgreSQL REASSIGN OWNED pour réattribuer la propriété de ces objets à un autre utilisateur. Lors de l'exécution de cette commande, une erreur similaire à la suivante peut s'afficher :

pg_example=> select current_user;
 current_user
--------------
 test_user
pg_example=> REASSIGN OWNED BY test_user TO another_user;
ERROR:  permission denied to reassign objects

Pour résoudre ce problème, vous devez autoriser l'utilisateur ou le rôle à l'utilisateur qui réattribue la propriété. Vous ne pouvez pas utiliser test_user pour le faire car test_user n'est pas le propriétaire de another_user. Par conséquent, une erreur similaire à la suivante peut s'afficher :

pg_example=> select current_user;
 current_user
--------------
 test_user
pg_example=> grant another_user to test_user;
ERROR:  must have admin option on role "another_user"

Vous pouvez procéder de l'une des manières suivantes pour autoriser l'utilisateur ou le rôle à l'utilisateur qui réattribue la propriété :

  • Connectez-vous à votre utilisateur principal et exécutez la commande GRANT :
pg_example=> select current_user;
 current_user
--------------
 admin_user
pg_example=> GRANT another_user TO test_user;
GRANT ROLE
  • Connectez-vous à l'utilisateur qui va réattribuer la propriété et exécutez la commande GRANT :
pg_example=> select current_user;
 current_user
--------------
 another_user
pg_example=> GRANT another_user TO test_user;
GRANT ROLE

Après avoir choisi l'une des options précédentes, réaffectez la propriété des objets appartenant à test_user à another_user après vous être connecté à test_user :

pg_example=> select current_user;
 current_user
--------------
 test_user
pg_example=> reassign owned by test_user to another_user;
REASSIGN OWNED

Si vous vous connectez à votre utilisateur principal et que vous essayez de supprimer test_user qui possède toujours des privilèges, vous risquez d'avoir une erreur similaire à la suivante :

pg_example=> select current_user;
 current_user
--------------
 admin_user
pg_example=> DROP ROLE test_user;
ERROR:  role "test_user" cannot be dropped because some objects depend on it
DETAIL:  privileges for database pg_example
privileges for table test_t2

Dans ce cas, vous obtenez une erreur même si la commande REASSIGN réussit. En effet, les privilèges de test_user doivent être révoqués. Exécutez la commande REVOKE pour révoquer toutes les autorisations d'utilisation de tout objet sur lequel test_user dispose de privilèges. Dans cet exemple, révoquez les autorisations sur la base de données pg_example et la table test_t2 pour test_user.

pg_example=> REVOKE ALL ON TABLE test_t2 FROM test_user;
REVOKE
pg_example=> REVOKE ALL ON DATABASE pg_example FROM test_user;
REVOKE

Ensuite, supprimez l'utilisateur test_user :

pg_example=> DROP ROLE test_user;
DROP ROLE

Après avoir révoqué les privilèges, vous pouvez supprimer le rôle.


Informations connexes

Documentation PostgreSQL relative à DROP ROLE

AWS OFFICIEL
AWS OFFICIELA mis à jour il y a 2 ans