Ongoing service disruptions
For the most recent update on ongoing service disruptions affecting the AWS Middle East (UAE) Region (ME-CENTRAL-1), refer to the AWS Health Dashboard. For information on AWS Service migration, see How do I migrate my services to another region?
Wie behebe ich den Fehler „user cannot be dropped“ in Amazon Redshift?
Ich kann in Amazon Redshift keinen Benutzer oder keine Gruppe droppen.
Kurzbeschreibung
Wenn Sie versuchen, einen Benutzer in Amazon Redshift zu droppen, wird möglicherweise eine der folgenden Fehlermeldungen angezeigt:
- ERROR: user "username" cannot be dropped because some objects depend on it
- ERROR: user "username" cannot be dropped because the user has a privilege on some object
- ERROR: user "username" cannot be dropped because the user owns some object
Diese Fehler können auftreten, wenn Sie versuchen, diese Benutzertypen zu droppen:
- Einen Besitzer oder Zielbenutzer mit Standardberechtigungen.
- Einen Besitzer eines beliebigen Objekts (wie Datenbanken, Schemas, Tabellen, Ansichten, Prozeduren und Bibliotheken).
- Einen Benutzer, der Berechtigungen für Objekte hat.
Um diese Fehlermeldungen zu beheben, müssen Sie zunächst alle Benutzerberechtigungen entfernen. Übertragen Sie dann den Objektbesitz oder entfernen Sie die Gruppeneigenschaft der Objekte.
Wichtig: Du musst Benutzer- und Gruppenberechtigungen für alle Datenbanken im Amazon Redshift-Cluster entziehen. Um die Liste der Datenbanken im Cluster anzuzeigen, führe den Befehl SHOW DATABASES aus. Um den Namen der Datenbank anzuzeigen, bei der du angemeldet bist, führe den Befehl CURRENT_DATABASE aus.
Lösung
Installieren von Skripten zum Erstellen von Ansichten
Lade die Skripte v_generate_user_grant_revoke_ddl.sql und v_find_dropuser_objs.sql als Superuser aus dem AWS-Übungen-Repository auf der GitHub-Website herunter und installiere sie. Die Ansichten für die Skripte v_generate_user_grant_revoke_ddl.sql und v_find_dropuser_objs.sql verwenden das Admin-Schema in ihrer Definition. Wenn kein Admin-Schema auf dem Amazon-Redshift-Cluster vorliegt, ändere die Definition in einem vorhandenen Schema. Oder erstelle ein Admin-Schema.
Wenn du jegliche Spalten in der Ansichtsdefinition änderst, droppst du die Ansicht, bevor du eine neue Ansicht und Definition erstellst. Wenn du eine neue Ansicht erstellst, bevor du die alte Ansicht gedroppt hast, erhältst du einen Fehler not valid table.
Droppen eines Benutzers
Führe die folgenden Schritte aus:
-
Öffne den Abfrage-Editor v2. Suche dann nach dem Benutzer, den du löschen möchtest, um die erteilten Benutzerberechtigungen anzuzeigen.
-
Um einem anderen Benutzer die Berechtigungen erneut zu gewähren, führe den folgenden Befehl aus:
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: Um die Berechtigungen erneut zu gewähren, müssen Sie ein Benutzer mit Berechtigungen für das Objekt sein. Sie müssen außerdem über die Berechtigung verfügen, einem anderen Benutzer Berechtigungen zu erteilen. Wenn du kein Recht zur Gewährung von Berechtigungen hast, kannst du die Berechtigungen als Superuser erneut gewähren.
-
Nachdem du einem anderen Benutzer die Berechtigungen erneut erteilt hast, führe den folgenden Befehl aus, um dem Benutzer die Berechtigungen zu entziehen:
select ddl from v_generate_user_grant_revoke_ddl where ddltype='revoke' and (grantee='username' or grantor='username') order by objseq, grantseq desc;Hinweis: Ersetze Grantor durch den Namen des Benutzers, der die Berechtigungen gewährt. Ersetze Empfänger durch den Namen des Benutzers, der die Berechtigungen erhält.
Wenn die Abfrage keine Datensätze zurückgibt oder der Befehl DROP USER fehlschlägt, führe 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;Die vorherige Abfrage listet alle zusätzlichen Berechtigungen auf, die du dem Benutzer entziehen musst. Widerrufe diese Berechtigungen.
-
Führe die folgenden Abfragen aus, um nach leeren Zugriffssteuerungslisten (ACLs) zu suchen:
select * from pg_user where username = 'username-to-be-dropped'; select * from pg_default_acl where defacluser= user-id; select pg_get_iam_role_by_user('user-name');Hinweis: Ersetze username-to-be-drop und user-name durch deine Werte. Um den Benutzernamen und die Benutzer-ID abzurufen, suche die Spalteneinträge usename und usesysid in der Tabelle PG_USER_INFO. Wenn die Tabelle PG_DEFAULT_ACL Benutzereinträge enthält, kannst du den Benutzer nicht droppen.
-
Wenn der Benutzer immer noch über Berechtigungen für Objekte verfügt, überprüfe, ob dem Benutzer assumerole-Berechtigungen erteilt wurden:
select pg_get_iam_role_by_user('user-name');Wenn der Benutzer assumerole-Berechtigungen hat, entziehe zunächst der Öffentlichkeit assumerole. Führen Sie dann den folgenden Befehl aus, um den username zu widerrufen:
revoke assumerole on all from public for all; revoke assumerole on all from user-name for all; -
(Optional) Wenn der 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 erteilt wurden.
Führe die folgenden Abfragen aus, um zu überprüfen, welche Berechtigungen der Benutzer noch hat:select * from pg_user where username = 'username-to-be-dropped'; select * from pg_group;Prüfe in der Ausgabe der pg_group-Abfrage, ob Einträge vorhanden sind, die den Benutzer in der Spalte grolist auflisten. Wenn der Benutzer einer anderen Gruppe angehört, wird in der Spalte grolist die Benutzer-ID angezeigt. Führe den folgenden Befehl aus, um die Berechtigungen einer Gruppe zu überprüfen:
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';Hinweis: Ersetze objname und schemaname durch die Tabelle und das Schema. Standardmäßig gewährt Amazon Redshift allen Benutzern die der PUBLIC-Gruppe erteilten Berechtigungen.
-
Finde alle Objekte, die der Benutzer besitzt und übertrage Besitz dann auf einen anderen Benutzer oder Administrator:
select ddl||'newuser;' as ddl from admin.v_find_dropuser_objs where objowner = 'username-to-be-dropped';In der Ausgabe des obigen Befehls sind die Befehle aufgeführt, die du verwenden musst, um den Besitz an einen neuen Benutzer zu übertragen.
-
Wiederhole die Schritte 2–7 in jeder Datenbank im Amazon-Redshift-Cluster.
Hinweis: Um die Datenbanken aufzulisten, führe den Befehl SHOW DATABASES aus. -
Führe den folgenden Befehl aus, um den Benutzer aus der Datenbank zu entfernen:
drop user username-to-be-dropped;
Droppen einer Gruppe
Hinweis: Bevor Sie eine Gruppe droppen, müssen Sie alle Berechtigungen widerrufen, die die Gruppe für Objekte besitzt.
Führe die folgenden Schritte aus:
-
Suchen nach allen Berechtigungen, die der Gruppe gewährt wurden, und widerrufe die Berechtigungen:
select ddl from admin.v_generate_user_grant_revoke_ddl where ddltype='revoke' and grantee= 'group group-name'; -
Wiederhole Schritt 1 in jeder Datenbank auf dem Amazon Redshift-Cluster, um die Berechtigungen der Gruppe in allen Datenbanken zu widerrufen.
-
Verwende den Befehl DROP GROUP, um die Benutzergruppe zu entfernen.
- Themen
- Analytics
- Tags
- Amazon Redshift
- Sprache
- Deutsch

Relevanter Inhalt
AWS OFFICIALAktualisiert vor 4 Monaten