Direkt zum Inhalt

Wie behebe ich den Fehler „user cannot be dropped“ in Amazon Redshift?

Lesedauer: 5 Minute
0

Ich kann in Amazon Redshift keine Benutzer oder Gruppen löschen.

Kurzbeschreibung

Wenn du versuchst, eine(n) Benutzer:in in Amazon Redshift zu löschen, 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 du versuchst, diese Benutzertypen zu löschen:

  • Ein(e) Eigentümer:in oder Zielbenutzer:in mit Standardberechtigungen
  • Ein(e) Eigentümer:in eines beliebigen Objekts, wie z. B. Datenbanken, Schemas, Tabellen, Ansichten, Prozeduren und Bibliotheken
  • Ein(e) Benutzer:in, der/die Berechtigungen für Objekte hat

Um diese Fehlermeldungen zu beheben, musst du zunächst alle Benutzerberechtigungen entfernen. Übertrage dann die Objekteigentümerschaft oder entferne die Gruppeneigentümerschaft an den Objekten.

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 Skripts zum Erstellen von Ansichten

Lade die Skripts 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 Skripts 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, lösche die Ansicht, bevor du eine neue Ansicht und Definition erstellst. Wenn du eine neue Ansicht erstellst, bevor du die alte Ansicht gelöscht hast, erhältst du einen not valid table-Fehler.

Eine(n) Benutzer:in löschen

Gehe wie folgt vor:

  1. Öffne den Query Editor v2. Suche dann nach dem/der Benutzer:in, den/die du löschen möchtest, um die erteilten Benutzerberechtigungen anzuzeigen.

  2. Um einem/einer anderen Benutzer:in die Berechtigungen erneut zu erteilen, 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 erteilen, musst du ein(e) Benutzer:in mit Berechtigungen für das Objekt sein. Du musst außerdem über die Berechtigung verfügen, einem/einer anderen Benutzer:in Berechtigungen zu erteilen. Wenn du kein Recht zur Erteilung von Berechtigungen hast, kannst du die Berechtigungen als Superuser erneut erteilen.

  3. Nachdem du einem/einer anderen Benutzer:in die Berechtigungen erneut erteilt hast, führe den folgenden Befehl aus, um dem/der Benutzer:in 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 erteilt. Ersetze grantee 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/der Benutzer:in entziehen musst. Widerrufe diese Berechtigungen.

  4. 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-dropped 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/die Benutzer:in nicht löschen.

  5. Wenn der/die Benutzer:in immer noch über Berechtigungen für Objekte verfügt, überprüfe, ob dem/der Benutzer:in assumerole-Berechtigungen erteilt wurden:

    select pg_get_iam_role_by_user('user-name');

    Wenn der/die Benutzer:in über die assumerole-Berechtigungen verfügt, entziehe dem öffentlichen Bereich zunächst assumerole. Führe dann den folgenden Befehl aus, um username zu widerrufen:

    revoke assumerole on all from public for all;  
    revoke assumerole on all from user-name for all;
  6. (Optional) Wenn der/die Benutzer:in noch über Berechtigungen für einige Objekte verfügt, überprüfe, ob der/die Benutzer:in Teil einer anderen Gruppe ist. Der/die Benutzer:in verfügt möglicherweise über Berechtigungen, die ihm/ihr von dieser Gruppe erteilt wurden. Oder der/die Benutzer:in 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/die Benutzer:in 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/die Benutzer:in in der Spalte grolist aufführen. Wenn der/die Benutzer:in 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.

  7. Suche nach allen Objekten, die der/die Benutzer:in besitzt und übertrage die Eigentümerschaft dann auf eine(n) andere(n) Benutzer:in oder Administrator:in:

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

    In der Ausgabe des vorherigen Befehls sind die Befehle aufgeführt, die du verwenden musst, um die Eigentümerschaft auf eine(n) neue(n) Benutzer:in zu übertragen.

  8. Wiederhole die Schritte 2–7 in jeder Datenbank im Amazon-Redshift-Cluster.
    Hinweis: Um die Datenbanken aufzulisten, führe den Befehl SHOW DATABASES aus.

  9. Führe den folgenden Befehl aus, um den/die Benutzer:in aus der Datenbank zu entfernen:

    drop user username-to-be-dropped;

Löschen einer Gruppe

Hinweis: Bevor du eine Gruppe löschst, musst du alle Berechtigungen widerrufen, die die Gruppe für Objekte besitzt.

Gehe wie folgt vor:

  1. Suche nach allen Berechtigungen, die der Gruppe erteilt wurden, und widerrufe die Berechtigungen:

    select ddl from admin.v_generate_user_grant_revoke_ddl where ddltype='revoke' and grantee= 'group group-name';
  2. Wiederhole Schritt 1 in jeder Datenbank auf dem Amazon-Redshift-Cluster, um die Berechtigungen der Gruppe in allen Datenbanken zu widerrufen.

  3. Verwende den Befehl DROP GROUP, um die Benutzergruppe zu entfernen.

AWS OFFICIALAktualisiert vor einem Jahr