Ci sono alcuni requisiti di autorizzazione molto poco intuitivi quando si utilizza REASSIGN
.
Ho scoperto che quando un account superutente non è disponibile (come nel caso di RDS o Cloud SQL) devo concedere il ruolo di destinazione al mio ruolo attuale per riassegnare o eliminare gli oggetti di proprietà dal ruolo di destinazione. Ad esempio, se il mio utente attivo è postsgres
e sto cercando di rimuovere 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
Ora, diventa un po' più complicato se user_a
sembra essere un membro di postgres
, soprattutto se capita di ereditare quell'appartenenza tramite qualche altro ruolo, chiamiamolo 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;
Voilà!
Nota:qui c'è un'altra risposta ampiamente referenziata ed efficace:https://sysadmintips.com/services/databases/postgresql-error-permission-denied-to-reassign-objects/ che funziona alla grande, purché tu sia in grado di creare e accedere come nuovo utente temporaneo. Tuttavia, in alcuni contesti, questo è un problema in sé (e quindi hai anche la pulizia extra da gestire per rimuovere quel ruolo temporaneo quando hai finito), quindi ho cercato di evitarlo qui.