Wie behebe ich den Fehler „Benutzer kann nicht gelöscht werden“ in Amazon Redshift?

Lesedauer: 6 Minute
0

Ich kann einen Benutzer oder eine Gruppe in Amazon Redshift nicht löschen.

Kurzbeschreibung

Wenn Sie versuchen, einen Benutzer in Amazon Redshift zu löschen, wird möglicherweise eine der folgenden Fehlermeldungen angezeigt:

  • FEHLER: Der „Benutzername“ des Benutzers kann nicht gelöscht werden, da einige Objekte davon abhängen
  • FEHLER: Der „Benutzername“ des Benutzers kann nicht gelöscht werden, da der Benutzer eine Berechtigung für ein Objekt hat
  • FEHLER: Der „Benutzername“ des Benutzers kann nicht gelöscht werden, da der Benutzer ein Objekt besitzt

Diese Fehler können auftreten, wenn Sie versuchen, diese Benutzertypen zu löschen:

  • Besitzer oder Zielbenutzer von Standardberechtigungen, die zuvor gewährt wurden.
  • Besitzer eines beliebigen Objekts (wie Datenbanken, Schemas, Tabellen, Ansichten, Prozeduren und Bibliotheken).
  • Der Benutzer hat Rechte für die zuvor genannten Objekte.

Um diese Fehlermeldungen zu beheben, müssen Sie zunächst alle Benutzerberechtigungen entfernen. Anschließend müssen Sie den Objektbesitz übertragen oder die Gruppeneigenschaft der Objekte entfernen.

Wichtig: Sie müssen Benutzer- und Gruppenberechtigungen für alle Datenbanken im Amazon Redshift-Cluster entziehen.

Behebung

Einen Benutzer löschen

Wichtig: Bevor Sie einen Benutzer löschen, widerrufen Sie alle Benutzerberechtigungen. Übertragen Sie dann das Eigentum an allen Datenbankobjekten, die dem Benutzer gehören.

1.Laden Sie die Skripts v_generate_user_grant_revoke_ddl.sql und v_find_dropuser_objs.sql aus dem GitHub-Repository von AWS Labs herunter und installieren Sie sie. Diese Skripts erstellen Ansichten in Amazon Redshift, die für die nächsten beiden Schritte nützlich sind.

Hinweis: Die Ansichten für die Skripts v_generate_user_grant_revoke_ddl.sql und v_find_dropuser_objs.sql verwenden das admin-Schema in ihrer Definition. Wenn Sie kein admin-Schema auf dem Amazon Redshift-Cluster erstellt haben, erstellen Sie diese Ansichten in einem anderen vorhandenen Schema. Um diese Ansichten in einem anderen Schema zu erstellen, ändern Sie die Definition oder erstellen Sie ein Admin-Schema. Wenn es in Ihrer Ansichtsdefinition Spaltenänderungen gibt, löschen Sie Ihre Ansicht, bevor Sie eine neue Ansicht und Definition erstellen. Wenn eine Ansicht bereits existiert und Sie versuchen, eine neue zu erstellen, bevor Sie die alte Ansicht löschen, erhalten Sie die Fehlermeldung „Tabelle nicht gültig“.

  1. Finden Sie alle erteilten Benutzerberechtigungen von Benutzern, die gelöscht werden müssen. Erteilen Sie diese Berechtigungen dann erneut als einem anderen Benutzer. Es hat sich bewährt, dass dieser Benutzer ein Superuser ist.
select regexp_replace(ddl,grantor,'<superuser>') from v_generate_user_grant_revoke_ddl where grantor='<username>' and ddltype='grant' and objtype <>'default acl' order by objseq,grantseq;

Hinweis: Der Benutzer, der die Berechtigungen neu erteilt, muss ein Benutzer mit Berechtigungen für das Objekt sein. Dieser Benutzer muss einem anderen Benutzer Berechtigungsrechte erteilt haben. Wenn es keine anderen Benutzer mit Regrant-Berechtigungen gibt, können Sie die Berechtigungen als superuser erneut gewähren.

3.Suchen Sie nach allen Berechtigungen, die dem Benutzer gewährt wurden, und widerrufen Sie sie dann:

select ddl from v_generate_user_grant_revoke_ddl where ddltype='revoke' and (grantee='<username>' or grantor='<username>') order by objseq, grantseq desc;

Hinweis: Stellen Sie sicher, dass Sie Grantor und Grantee durch die Benutzernamen ersetzen, die jeweils Berechtigungen gewähren und erhalten können.

Wenn Ihre Abfrage keine Datensätze zurückgibt oder der Befehl Benutzer löschen fehlschlägt, führen Sie diese Abfrage aus:

select ddl from admin.v_generate_user_grant_revoke_ddl where ddltype='revoke' and ddl ilike '%<user-to-be-dropped>%' order by objseq, grantseq desc;

Diese Abfrage listet die Berechtigungen auf, die dem Benutzer entzogen werden müssen, bevor der Benutzer gelöscht werden kann. Widerrufen Sie diese Berechtigungen, bevor Sie mit dem nächsten Schritt fortfahren.

4.Führen Sie diese Abfragen aus, um nach leeren Zugriffskontrolllisten (ACLs) zu suchen:

select \* from pg\_user where usename = '<username-to-be-dropped>'; select \* from pg\_default\_acl where defacluser= <user-id>;

Um den Benutzernamen und die Benutzer-ID abzurufen, suchen Sie die Spalteneinträge usename und usesysid in der Tabelle PG_USER.
Hinweis: Sie können einen Benutzer nicht löschen, wenn die Tabelle PG_DEFAULT_ACL Benutzereinträge enthält.

5.Wenn der zu löschende Benutzer immer noch über Berechtigungen für einige Objekte verfügt, überprüfen Sie, ob dem Benutzer die Berechtigungen zur Übernahme von Rollen erteilt wurden. Um dies zu überprüfen, führen Sie diese Abfrage aus:

select pg\_get\_iam\_role\_by\_user('<user-name>');

Wenn Sie sehen, dass Assumerole-Berechtigungen für den Benutzer gelöscht werden, widerrufen Sie sie mit dem folgenden Befehl:

revoke assumerole on all from <user-name> for all;

6.(Optional) Wenn der zu lösende Benutzer noch über Berechtigungen für einige Objekte verfügt, überprüfen Sie, ob der Benutzer Teil einer anderen Gruppe ist. Der Benutzer verfügt möglicherweise über Berechtigungen, die ihm von dieser Gruppe erteilt wurden. Oder der Benutzer verfügt möglicherweise über Berechtigungen, die der Gruppe PUBLIC (oder allen Benutzern) erteilt wurden.

Führen Sie die folgenden Abfragen aus, um zu überprüfen, welche Berechtigungen dem Benutzer noch erteilt wurden:

select * from pg_user where usename = '<username-to-be-dropped>';select * from pg_group;

Überprüfen Sie in der Ausgabe der zweiten Abfrage die Spalte Grolist. Überprüfen Sie, ob es Einträge gibt, die den Benutzer auflisten, der gelöscht werden soll. Wenn der zu löschende Benutzer zu einer anderen Gruppe gehört, wird die Benutzer-ID aufgeführt.

Wenn in Ihrer Spalte Grolist angegeben ist, dass der Benutzer Teil einer Gruppe ist, überprüfen Sie die Berechtigungen, die dieser Gruppe gewährt wurden:

select ddl from admin.v_generate_user_grant_revoke_ddl where ddltype='revoke' and grantee= 'group <group-name>' ;select * from admin.v_generate_user_grant_revoke_ddl where objname='timecards' and schemaname='postgres' and grantee='PUBLIC' and ddltype='revoke';

Stellen Sie sicher, dass Sie objname und schemaname durch Ihre jeweilige Tabelle und Ihr Schema ersetzen.

Hinweis: Standardmäßig werden der Gruppe ÖFFENTLICH erteilte Berechtigungen allen Benutzern gewährt.

7.Suchen Sie nach allen Objekten, die dem Benutzer gehören, und übertragen Sie dann die Eigentümerschaft von dem Benutzer, der gelöscht wurde, auf einen anderen Benutzer oder Administrator:

select ddl||'<newuser>;' as ddl from admin.v_find_dropuser_objs where objowner = '<username-to-be-dropped>';

Diese Ausgabe listet die Befehle auf, mit denen Sie die Inhaberschaft auf einen neuen Benutzer übertragen können. Stellen Sie sicher, dass Sie die aufgelisteten Befehle ausführen.

8.Wiederholen Sie die Schritte 2-7 in jeder Datenbank im Amazon Redshift-Cluster.

9.Verwenden Sie den Befehl LÖSCHEN BENUTZER, um den Benutzer aus der Datenbank zu entfernen:

drop user <username-to-be-dropped>;

Eine Gruppe löschen

Hinweis: Bevor Sie eine Gruppe löschen, müssen Sie alle Berechtigungen widerrufen, die die Gruppe für Objekte besitzt.

1.Laden Sie die Skripts v_generate_user_grant_revoke_ddl.sql und v_find_dropuser_objs.sql aus dem GitHub-Repository von AWS Labs herunter und installieren Sie sie. Diese Skripts erstellen Ansichten in Amazon Redshift, die für den nächsten Schritt nützlich sind.

Hinweis: Die Ansichten für die Skripts v_generate_user_grant_revoke_ddl.sql und v_find_dropuser_objs.sql verwenden das admin-Schema in ihrer Definition. Wenn Sie kein admin-Schema auf dem Amazon Redshift-Cluster erstellt haben, können Sie diese Ansichten in jedem anderen vorhandenen Schema erstellen. Um diese Ansichten in einem anderen Schema zu erstellen, ändern Sie die Definition oder erstellen Sie ein Admin-Schema.

2.Suchen Sie nach allen Berechtigungen, die der Gruppe gewährt wurden, und widerrufen Sie sie dann, wie in diesem Beispiel gezeigt:

select ddl from admin.v_generate_user_grant_revoke_ddl where ddltype='revoke' and grantee= 'group <group-name>';

3.Wiederholen Sie die Schritte 2 in jeder Datenbank im Amazon Redshift-Cluster. Vergewissern Sie sich, dass die Berechtigungen der Gruppe in allen Datenbanken aufgehoben wurden.

4.Verwenden Sie den Befehl LÖSCHEN GRUPPE, um die Benutzergruppe zu entfernen.

Verwandte Informationen

Hinweise zur Verwendung von LÖSCHEN BENUTZER

Beispiel für LÖSCHEN GRUPPE

AWS OFFICIAL
AWS OFFICIALAktualisiert vor 9 Monaten