PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Impossibile eliminare un ruolo concesso per la connessione al database

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.