J'essayais de supprimer l'utilisateur PostgreSQL:
DROP USER ryan;
J'ai reçu cette erreur:
Error in query: ERROR: role "ryan" cannot be dropped because some objects depend on it DETAIL: privileges for database mydatabase
J'ai cherché une solution à partir de ces fils:
Ont toujours la même erreur.
Cela se produit après avoir accordé toutes les autorisations à l'utilisateur "ryan" avec:
GRANT ALL PRIVILEGES ON DATABASE mydatabase ON SCHEMA public TO ryan;
Débarrassez-vous de tous les privilèges avec DROP OWNED
(ce qui n'est pas trop évident d'après le libellé). Le manuel:
[...] Tous les privilèges accordés aux rôles donnés sur les objets de la base de données courante et sur les objets partagés (bases de données, espaces disque logiques) seront également révoqués.
La séquence fiable de commandes pour supprimer un rôle est donc:
REASSIGN OWNED BY ryan TO postgres; -- or some other trusted role
DROP OWNED BY ryan;
-- repeat in ALL databases where the role owns anything or has any privileges!
DROP USER ryan;
En relation:
Ce qui a fonctionné pour moi, c'est 1) Se connecter à la base de données
\c mydatabase
2) Réattribution de la propriété
REASSIGN OWNED BY ryan TO <newuser>;
Ou/et simplement supprimer l'objet
DROP OWNED BY ryan;
3) Exécution des privilèges REVOKE
REVOKE ALL PRIVILEGES ON ALL TABLES IN SCHEMA public FROM ryan;
REVOKE ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public FROM ryan;
REVOKE ALL PRIVILEGES ON ALL FUNCTIONS IN SCHEMA public FROM ryan;
4) Supprimer l'utilisateur
DROP USER ryan;
PS: Il se peut que vous n'ayez pas besoin d'exécuter les étapes 2 et 3, une seule des deux étapes peut généralement suffire.
Accorder toutes les autorisations à ryan n'aidera pas, il est probable qu'il soit le propriétaire de la base de données. Vous devrez faire en sorte que quelqu'un d'autre le possède:
REASSIGN OWNED BY ryan TO postgres;
à moins que vous n'ayez plus besoin de ma base de données, si c'est le cas, déposez simplement la base de données (ASSUREZ-VOUS QUE VOUS N'EN AVEZ PAS BESOIN AVANT DE LE FAIRE):
DROP DATABASE mydatabase;