Er zijn enkele zeer onintuïtieve toestemmingsvereisten bij het gebruik van REASSIGN
.
Ik heb ontdekt dat wanneer een superuser-account niet beschikbaar is (zoals in het geval van RDS of Cloud SQL) ik de doelrol moet toewijzen aan mijn huidige rol om eigendomsobjecten opnieuw toe te wijzen of uit de doelrol te verwijderen. Als mijn actieve gebruiker bijvoorbeeld postsgres
. is , en ik probeer user_a
. te verwijderen :
> 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
Nu wordt het een beetje lastiger als user_a
is toevallig lid van postgres
, vooral als het toevallig dat lidmaatschap erft via een andere rol, laten we het schema_admin
noemen ...
> 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;
Voilà!
Opmerking:hier is nog een veelgebruikt en effectief antwoord:https://sysadmintips.com/services/databases/postgresql-error-permission-denied-to-reassign-objects/ wat prima werkt, zolang je in staat bent om een nieuwe tijdelijke gebruiker aan te maken en in te loggen. In sommige contexten is dat echter een probleem op zich (en dan heb je ook nog de extra opschoning om die tijdelijke rol te verwijderen als je klaar bent), dus ik heb geprobeerd dat hier te vermijden.