PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Impossible de supprimer un rôle accordé pour se connecter à la base de données

Il existe des exigences d'autorisation très peu intuitives lors de l'utilisation de REASSIGN .

J'ai constaté que lorsqu'un compte de superutilisateur n'est pas disponible (comme dans le cas de RDS ou de Cloud SQL), je dois accorder le rôle cible à mon rôle actuel afin de réaffecter ou de supprimer les objets appartenant au rôle cible. Par exemple, si mon utilisateur actif est postsgres , et j'essaie de supprimer user_a :

> DROP OWNED BY user_a
ERROR:  permission denied to drop objects
> GRANT user_a TO postgres;
GRANT ROLE
> DROP OWNED BY user_a;
DROP OWNED

Maintenant, cela devient un peu plus délicat si user_a se trouve être membre de postgres , surtout s'il hérite de cette appartenance via un autre rôle, appelons-le schema_admin ...

> DROP OWNED BY user_a
ERROR:  permission denied to drop objects
> GRANT user_a TO postgres;
ERROR:  role "user_a" is a member of role "postgres"

-- Alright, let's try to revoke it...
> REVOKE postgres FROM user_a;
REVOKE ROLE
> GRANT user_a TO postgres;
ERROR:  role "user_a" is a member of role "postgres"

-- It's still a member through the inherited grant - trying to revoke again doesn't work:
> REVOKE postgres FROM user_a;
WARNING:  role "user_a" is not a member of role "postgres"
REVOKE ROLE

-- So you have to identify the role it's inheriting from, and revoke that:
> REVOKE schema_admin FROM user_a;
REVOKE ROLE
> GRANT user_a TO postgres;
GRANT ROLE

-- Now just to be safe, I'll reassign owned objects before actually dropping everything:
> REASSIGN OWNED BY user_a TO postgres;
REASSIGN OWNED
> DROP OWNED BY user_a;
DROP OWNED
> DROP ROLE user_a;
DROP ROLE;

Voila !

Remarque :Il existe une autre réponse efficace et largement référencée ici :https://sysadmintips.com/services/databases/postgresql-error-permission-denied-to-reassign-objects/ qui fonctionne très bien, tant que vous êtes en mesure de créer et de vous connecter en tant que nouvel utilisateur temporaire. Cependant, dans certains contextes, c'est un problème en soi (et vous avez également le nettoyage supplémentaire à gérer en supprimant ce rôle temporaire lorsque vous avez terminé), j'ai donc essayé d'éviter cela ici.