Warum kann ich in meiner DB-Instance in RDS für PostgreSQL einen Benutzer oder eine Rolle nicht löschen?

Lesedauer: 6 Minute
0

Wenn ich versuche, einen Benutzer oder eine Rolle in meiner Instance im Amazon Relational Database Service (Amazon RDS) für PostgreSQL zu löschen, erhalte ich die Fehlermeldung „role cannot be dropped because some objects depend on it“ (Rolle kann nicht gelöscht werden, da einige Objekte davon abhängen).

Kurzbeschreibung

Wenn ein Benutzer oder eine Rolle in RDS für PostgreSQL ein Objekt erstellt, z. B. eine Tabelle oder ein Schema, ist der Benutzer oder die Rolle der Besitzer des erstellten Objekts. Wenn Sie versuchen, einen Benutzer oder eine Rolle zu löschen, der oder die ein oder mehrere Objekte in einer Datenbank besitzt oder über Berechtigungen für diese Objekte verfügt, wird eine Fehlermeldung angezeigt, dass es Objekte gibt, die vom Benutzer oder der Rolle abhängig sind, zusammen mit erteilten Berechtigungen, falls vorhanden.

Um einen Benutzer oder eine Rolle mit abhängigen Objekten zu löschen, müssen Sie Folgendes tun:

  1. Weisen Sie die Eigentümerschaft dieser Objekte einem anderen Benutzer neu zu.
  2. Entziehen Sie alle Berechtigungen, die dem Benutzer oder der Rolle erteilt wurden.

Hinweis: Wenn diese Objekte nicht mehr benötigt werden, sollten Sie erwägen, diese Objekte zu löschen und dann die Rolle zu löschen. Mit dem Befehl DROP OWNED können Sie alle Objekte, die einer Rolle gehören, in einer Datenbank löschen. Sie können auch Berechtigungen entziehen, die der Rolle für Objekte in dieser Datenbank oder für gemeinsam genutzte Objekte gewährt wurden. Nachdem der Befehl DROP OWNED erfolgreich ausgeführt wurde, können Sie die Rolle löschen.

Lösung

Im folgenden Beispiel werden drei verschiedene Datenbankrollen verwendet:

  • test_user: Dies ist der Benutzer oder die Rolle, die gelöscht werden muss.
  • admin_user: Dies ist die Rolle, die verwendet wird, um den erforderlichen Benutzer oder die erforderliche Rolle zu löschen. Dieser Benutzer ist der Benutzer mit den höchsten Berechtigungen in RDS, dem die Rolle rds_superuser zugeordnet ist.
  • another_user: Dies ist der Benutzer oder die Rolle, dem oder der der Besitz von Objekten zugewiesen wird, die sich im Besitz von test_user befinden.

Führen Sie den folgenden Befehl aus, um die Rolle anzuzeigen, mit der Sie sich angemeldet haben:

pg_example=> SELECT current_user;

Die Ausgabe sieht wie folgt aus:

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

Wenn Sie versuchen, einen Benutzer oder eine Rolle mit abhängigen Objekten zu löschen, wird eine Fehlermeldung folgender Art angezeigt:

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 diesem Beispiel lautet die zu löschende Rolle test_user. Beachten Sie, dass die aktuell angemeldete Rolle admin_user ist. Dies ist der Hauptbenutzer der Datenbank.

Aus der Fehlermeldung erhalten Sie die folgenden Informationen:

  • Die Rolle test_user verfügt über Berechtigungen, die für die Datenbank pg_example und die Tabelle test_t2 gewährt wurden.
  • Die Rolle test_user besitzt die Tabelle test_table, das Schema test_schema und ein Sequenzobjekt test_seq in test_schema.

Hinweis: Wenn Sie einen Benutzer oder eine Rolle löschen, während Sie mit einer anderen Datenbank verbunden sind, erhalten Sie eine Ausgabe folgender Art:

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

Um Objekte anzuzeigen, die einem Benutzer oder einer Rolle gehören, müssen Sie eine Verbindung zu der Datenbank herstellen, in der sich die in deren Besitz befindlichen Objekte befinden.

Um den Benutzer oder die Rolle zu löschen, müssen Sie die Eigentümerschaft der in deren Besitz befindlichen Objekte einem anderen Benutzer oder einer anderen Rolle neu zuweisen und die zugehörigen Berechtigungen entziehen. Sie können den PostgreSQL-Befehl REASSIGN OWNED verwenden, um die Eigentümerschaft dieser Objekte einem anderen Benutzer neu zuzuweisen. Wenn Sie diesen Befehl ausführen, wird möglicherweise eine Fehlermeldung folgender Art angezeigt:

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

Um dieses Problem zu beheben, müssen Sie den Benutzer oder die Rolle dem Benutzer zuweisen, der die Eigentümerschaft neu zuweist. Sie können test_user nicht dazu verwenden, da test_user nicht der Besitzer von another_user ist. Daher wird möglicherweise ein Fehler folgender Art angezeigt:

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"

Sie können einen der folgenden Schritte ausführen, um dem Benutzer, der die Eigentümerschaft neu zuweist, den Benutzer oder die Rolle zu erteilen:

  • Melden Sie sich bei Ihrem Master-Benutzer an und führen Sie den Befehl GRANT aus:
pg_example=> select current_user;
 current_user
--------------
 admin_user
pg_example=> GRANT another_user TO test_user;
GRANT ROLE
  • Melden Sie sich bei dem Benutzer an, der den Besitz neu zuweisen soll, und führen Sie den Befehl GRANT aus:
pg_example=> select current_user;
 current_user
--------------
 another_user
pg_example=> GRANT another_user TO test_user;
GRANT ROLE

Nachdem Sie eine der oben genannten Optionen ausgewählt haben, weisen Sie nach der Anmeldung bei test_user die Eigentümerschaft von Objekten, die sich im Besitz von test_user befinden, another_user zu:

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

Wenn Sie sich bei Ihrem Master-Benutzer anmelden und versuchen, test_user zu löschen, der noch über vorhandene Berechtigungen verfügt, kann ein Fehler folgender Art auftreten:

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 diesem Fall erhalten Sie eine Fehlermeldung, obwohl der Befehl REASSIGN erfolgreich war. Dies liegt daran, dass die Berechtigungen von test_user entzogen werden müssen. Führen Sie den Befehl REVOKE aus, um alle Nutzungsberechtigungen für Objekte zu entziehen, für die test_user Berechtigungen besitzt. Entziehen Sie in diesem Beispiel die Berechtigungen für die Datenbank pg_example und die Tabelle test_t2 für 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

Löschen Sie dann den Benutzer test_user:

pg_example=> DROP ROLE test_user;
DROP ROLE

Nach Entziehen der Berechtigungen können Sie die Rolle erfolgreich löschen.


Relevante Informationen

PostgreSQL-Dokumentation für DROP ROLE

AWS OFFICIAL
AWS OFFICIALAktualisiert vor 2 Jahren