Има някои много неинтуитивни изисквания за разрешение при използване на REASSIGN
.
Открих, че когато акаунтът на суперпотребител не е наличен (както в случая с RDS или Cloud SQL), трябва да предоставя целевата роля на текущата си роля, за да превъзлагам или премахвам притежавани обекти от целевата роля. Например, ако активният ми потребител е postsgres
и се опитвам да премахна 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
Сега става малко по-сложно, ако user_a
случайно е член на postgres
, особено ако се случи да наследи това членство чрез друга роля, нека го наречем 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;
Готово!
Забележка:Тук има друг широко използван и ефективен отговор:https://sysadmintips.com/services/databases/postgresql-error-permission-denied-to-reassign-objects/ което работи чудесно, стига да можете да създадете и да влезете като нов временен потребител. Въпреки това, в някои контексти това е проблем само по себе си (и тогава вие също трябва да се справите с допълнителното почистване, за да премахнете тази временна роля, когато сте готови), така че се опитах да избегна това тук.