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.