Při používání REASSIGN
existují některé velmi neintuitivní požadavky na oprávnění .
Zjistil jsem, že když superuživatelský účet není k dispozici (jako v případě RDS nebo Cloud SQL), musím přidělit cílovou roli své aktuální roli, abych mohl přeřadit nebo zrušit vlastněné objekty z cílové role. Například pokud je můj aktivní uživatel postsgres
a pokouším se odstranit 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
Nyní je to trochu složitější, pokud user_a
je náhodou členem postgres
, zvláště pokud se stane, že toto členství zdědí prostřednictvím nějaké jiné role, nazvěme ji 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!
Poznámka:Zde je další široce odkazovaná a účinná odpověď:https://sysadmintips.com/services/databases/postgresql-error-permission-denied-to-reassign-objects/ což funguje skvěle, pokud jste schopni vytvořit a přihlásit se jako nový dočasný uživatel. V některých kontextech je to však problém sám o sobě (a pak máte také další čištění, které musíte zvládnout odstraněním této dočasné role, když skončíte), takže jsem se tomu zde snažil vyhnout.