PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Eine Rolle, die zum Verbinden der Datenbank gewährt wurde, kann nicht gelöscht werden

Es gibt einige sehr unintuitive Berechtigungsanforderungen bei der Verwendung von REASSIGN .

Ich habe festgestellt, dass ich, wenn kein Superuser-Konto verfügbar ist (wie im Fall von RDS oder Cloud SQL), meiner aktuellen Rolle die Zielrolle zuweisen muss, um eigene Objekte aus der Zielrolle neu zuzuweisen oder zu löschen. Zum Beispiel, wenn mein aktiver Benutzer postsgres ist , und ich versuche, user_a zu entfernen :

> 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

Jetzt wird es etwas kniffliger, wenn user_a zufällig ein Mitglied von postgres ist , insbesondere wenn es passiert, dass es diese Mitgliedschaft durch eine andere Rolle erbt, nennen wir es 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!

Hinweis:Hier gibt es eine weitere häufig referenzierte und effektive Antwort:https://sysadmintips.com/services/databases/postgresql-error-permission-denied-to-reassign-objects/ was großartig funktioniert, solange Sie in der Lage sind, einen neuen temporären Benutzer zu erstellen und sich als neuen temporären Benutzer anzumelden. In einigen Kontexten ist dies jedoch ein Problem für sich (und dann müssen Sie auch die zusätzliche Bereinigung erledigen, indem Sie diese temporäre Rolle entfernen, wenn Sie fertig sind), also habe ich versucht, dies hier zu vermeiden.