Comme les rôles peuvent posséder des objets dans une base de données et peuvent détenir des droits pour accéder à d'autres objets, supprimer un rôle n'est généralement pas la seule exécution d'un DROP ROLE. Tout objet appartenant à un rôle doit d'abord être supprimé ou réaffecté à d'autres propriétaires ; et tout droit donné à un rôle doit être révoqué.
L'appartenance des objets doit être transférée, un à la fois, en utilisant
des commandes ALTER
, par exemple :
ALTER TABLE table_de_bob OWNER TO alice;
Il est aussi possible d'utiliser la commande REASSIGN OWNED pour réaffecter tous les objets du rôle à
supprimer à un autre rôle. Comme REASSIGN OWNED
ne peut
pas accéder aux objets dans les autres bases, il est nécessaire de l'exécuter
dans chaque base qui contient des objets possédés par le rôle. (Notez que la
première exécution de REASSIGN OWNED
changera le
propriétaire de tous les objets partagés entre bases de données, donc les
bases et les tablespaces, qui appartiennent au rôle à supprimer.)
Une fois que tous les objets importants ont été transférés aux nouveaux
propriétaires, tout objet restant possédé par le rôle à supprimer peut
être supprimé avec la commande DROP OWNED. Encore
une fois, cette commande ne peut pas accéder aux objets des autres bases
de données, donc il est nécessaire de l'exécuter sur chaque base qui
contient des objets dont le propriétaire correspond au rôle à supprimer.
De plus, DROP OWNED
ne supprimera pas des bases ou
tablespaces entiers, donc il est nécessaire de le faire manuellement si
le rôle possède des bases et/ou des tablespaces qui n'auraient pas été
transférés à d'autres rôles.
DROP OWNED
fait aussi attention à supprimer tout droit
donné au rôle cible pour les objets qui ne lui appartiennent pas. Comme
REASSIGN OWNED
ne touche pas à ces objets, il est
souvent nécessaire d'exécuter à la fois REASSIGN OWNED
et DROP OWNED
(dans cet ordre !) pour supprimer
complètement les dépendances d'un rôle à supprimer.
En bref, les actions de suppression d'un rôle propriétaire d'objets sont :
REASSIGN OWNED BY role_a_supprimer TO role_remplacant; DROP OWNED BY role_a_supprimer; -- répétez les commandes ci-dessus pour chaque base de données de l'instance DROP ROLE role_a_supprimer;
Lorsque les objets ne sont pas tous transférés au même rôle, il est préférable de gérer les exceptions manuellement, puis de réaliser les étapes ci-dessus pour le reste.
Si DROP ROLE
est tenté alors que des objets dépendants
sont toujours présents, il enverra des messages identifiant les objets à
réaffecter ou supprimer.