Perché non posso eliminare un utente o un ruolo nella mia istanza database RDS per PostgreSQL?

Ultimo aggiornamento: 07/07/2022

Quando provo a eliminare un utente o un ruolo nella mia istanza Amazon Relational Database Service (Amazon RDS) per PostgreSQL, viene visualizzato l'errore "role cannot be dropped because some objects depend on it" (impossibile eliminare il ruolo perché alcuni oggetti dipendono da esso).

Breve descrizione

Quando un utente o un ruolo in RDS per PostgreSQL crea un oggetto, ad esempio una tabella o uno schema, l'utente o il ruolo è il proprietario dell'oggetto creato. Se si tenta di eliminare un utente o un ruolo che possiede uno o più oggetti in un database o dispone di privilegi su questi oggetti, viene visualizzato un errore che indica la presenza di oggetti che dipendono dall'utente o dal ruolo insieme alle autorizzazioni concesse, se presenti.

Per eliminare un utente o un ruolo con oggetti dipendenti, è necessario effettuare le seguenti operazioni:

  1. Riassegnare la proprietà di questi oggetti a un altro utente.
  2. Revocare tutte le autorizzazioni concesse all'utente o al ruolo.

Nota: se questi oggetti non sono più necessari, puoi eliminarli e procedere quindi con l'eliminazione del ruolo. Puoi eliminare tutti gli oggetti di proprietà di un ruolo in un database utilizzando il comando DROP OWNED. Puoi anche revocare tutti i privilegi concessi al ruolo sugli oggetti nel database o sugli oggetti condivisi. Dopo aver eseguito correttamente il comando DROP OWNED, puoi eliminare il ruolo.

Risoluzione

Nell'esempio seguente, vengono utilizzati tre ruoli diversi del database:

  • test_user: questo è l'utente o il ruolo che deve essere eliminato.
  • admin_user: questo è il ruolo utilizzato per eliminare l'utente o il ruolo richiesto. Questo è l'utente con i massimi privilegi in RDS, il cui ruolo associato è rds_superuser.
  • another_user: è l'utente o il ruolo a cui è assegnata la proprietà degli oggetti di proprietà di test_user.

Esegui il seguente comando per vedere il ruolo con cui hai effettuato l'accesso:

pg_example=> SELECT current_user;

Dovresti visualizzare un output simile al seguente:

current_user
--------------
 admin_user
(1 row)

Quando tenti di eliminare un utente o un ruolo con oggetti dipendenti, viene visualizzato un errore simile al seguente:

pg_example=> DROP ROLE test_user;
ERROR:  role "test_user" cannot be dropped because some objects depend on it
DETAIL:  privileges for database pg_example
owner of table test_table
owner of schema test_schema
owner of sequence test_schema.test_seq
privileges for table test_t2

In questo esempio, il ruolo che viene eliminato è test_user. Il ruolo attualmente connesso è admin_user, che è l'utente master del database.

Nel messaggio di errore vengono visualizzate le seguenti informazioni:

  • Il ruolo test_user dispone di privilegi concessi sul database pg_example e sulla tabella test_t2.
  • Il ruolo test_user è proprietario della tabella test_table, dello schema test_schema e di un oggetto sequenza test_seq in test_schema.

Nota: se elimini un utente o un ruolo quando sei connesso a un database diverso, viene visualizzato un output simile al seguente:

pg_another_db=> DROP ROLE test_user;
ERROR:  role "test_user" cannot be dropped because some objects depend on it
DETAIL:  privileges for database pg_example
4 objects in database pg_example

Per visualizzare gli oggetti di proprietà di un utente o di un ruolo, accertati di connetterti al database in cui si trovano gli oggetti di proprietà.

Per eliminare l'utente o il ruolo, devi riassegnare la proprietà degli oggetti di proprietà a un altro utente o ruolo e revocare le autorizzazioni associate. Puoi utilizzare il comando PostgreSQL REASSIGN OWNED per riassegnare la proprietà di questi oggetti a un altro utente. Quando esegui questo comando, è possibile che venga visualizzato un errore simile al seguente:

pg_example=> select current_user;
 current_user
--------------
 test_user
pg_example=> REASSIGN OWNED BY test_user TO another_user;
ERROR:  permission denied to reassign objects

Per risolvere il problema, è necessario concedere l'utente o il ruolo all'utente che sta riassegnando la proprietà. Non puoi usare test_user per farlo perché test_user non è il proprietario di another_user. Pertanto, è possibile che venga visualizzato un errore simile al seguente:

pg_example=> select current_user;
 current_user
--------------
 test_user
pg_example=> grant another_user to test_user;
ERROR:  must have admin option on role "another_user"

Puoi procedere in uno di questi modi per concedere l'utente o il ruolo all'utente che sta riassegnando la proprietà:

  • Accedi al tuo utente master ed esegui il comando GRANT:
pg_example=> select current_user;
 current_user
--------------
 admin_user
pg_example=> GRANT another_user TO test_user;
GRANT ROLE
  • Accedi all'utente che riassegnerà la proprietà ed esegui il comando GRANT:
pg_example=> select current_user;
 current_user
--------------
 another_user
pg_example=> GRANT another_user TO test_user;
GRANT ROLE

Dopo aver scelto una delle opzioni precedenti, riassegna la proprietà degli oggetti di proprietà di test_user a another_user dopo aver effettuato l'accesso a test_user:

pg_example=> select current_user;
 current_user
--------------
 test_user
pg_example=> reassign owned by test_user to another_user;
REASSIGN OWNED

Se accedi all'utente master e tenti di eliminare test_user che dispone ancora di privilegi esistenti, potresti visualizzare un errore simile al seguente:

pg_example=> select current_user;
 current_user
--------------
 admin_user
pg_example=> DROP ROLE test_user;
ERROR:  role "test_user" cannot be dropped because some objects depend on it
DETAIL:  privileges for database pg_example
privileges for table test_t2

In questo caso, viene generato un errore anche se il comando REASSIGN viene eseguito correttamente. Questo perché i privilegi di test_user devono essere revocati. Esegui il comando REVOKE per revocare tutte le autorizzazioni di utilizzo da qualsiasi oggetto su cui test_user dispone di privilegi. In questo esempio, revoca le autorizzazioni sul database pg_example e sulla tabella test_t2 per test_user.

pg_example=> REVOKE ALL ON TABLE test_t2 FROM test_user;
REVOKE
pg_example=> REVOKE ALL ON DATABASE pg_example FROM test_user;
REVOKE

Quindi, elimina l'utentetest_user:

pg_example=> DROP ROLE test_user;
DROP ROLE

Dopo aver revocato i privilegi, puoi eliminare il ruolo.


Documentazione di PostgreSQL per il comando DROP ROLE

Questo articolo è stato utile?


Hai bisogno di supporto tecnico o per la fatturazione?