Wie kann ich Berechtigungen für neu erstellte Objekte in Amazon Redshift gewähren?

Lesedauer: 4 Minute
0

Mein Benutzer hat für ein neu erstelltes Objekt den Fehler „permission denied“ erhalten. Wie erteile ich dem Benutzer die erforderlichen Berechtigungen für den Zugriff auf neu erstellte Objekte im Schema?

Kurzbeschreibung

Benutzer, die auf neu erstellte Objekte im Schema zugreifen möchten, müssen über Zugriffsberechtigungen verfügen, die von einem Objekteigentümer oder einem Superuser gewährt wurden.

Wenn ein Benutzer nicht auf neu erstellte Objekte im Schema zugreifen kann, wird ihm möglicherweise die folgende Fehlermeldung angezeigt:

„ERROR: permission denied for relation 'objectname'“

Dieser Fehler tritt auf, wenn der Zugriff nur für die Objekte gewährt wird, die in einem Schema vorhanden waren, als der Zugriff zum ersten Mal gewährt wurde. Standardmäßig wird der Zugriff nicht automatisch für Objekte gewährt, die unter dem aktuellen Schema erstellt wurden.

Um dieses Problem zu beheben, gewähre dem Benutzer oder über Gruppenrollen Zugriffsrechte. Verwende den Befehl ALTER DEFAULT PRIVILEGES.

Lösung

Gehe als Superuser wie folgt vor, um Berechtigungen für die aktuellen und zukünftigen Tabellen im Schema zu gewähren:

  1. Führe die folgenden Befehle aus, um Nutzungszugriff auf das Schema und SELECT-Zugriff auf alle derzeit unter dem Schema vorhandenen Tabellen zu gewähren:
    Hinweis: Ersetze newtestschema durch den Namen deines Schemas und newtestuser durch den Namen des Benutzers.

    grant usage on schema newtestschema to newtestuser;
    grant select on all tables in schema newtestschema to newtestuser;
  2. Führe den folgenden Befehl aus, um dem Benutzer SELECT-Zugriff für zukünftige Tabellen zu gewähren, die unter dem Schema erstellt wurden:
    Hinweis: Ersetze awsuser durch den Benutzernamen, der verwendet wird, um zukünftige Objekte unter dem Schema zu erstellen. Ersetze dann newtestschema durch den Schemanamen und newtestuser durch den Benutzernamen, der Zugriff auf zukünftige Objekte benötigt.

    alter default privileges for user awsuser in schema newtestschema grant select on tables to newtestuser;

    Hinweis: Standardberechtigungen gelten nur für neue Objekte. Wenn du den Befehl ALTER DEFAULT PRIVILEGES ausführst, werden die Berechtigungen für vorhandene Objekte nicht geändert.

  3. Um zu überprüfen, ob dem Benutzer Standardberechtigungen gewährt wurden, führe die folgende Abfrage als Superuser aus:

    select * from svv_default_privileges where grantee_name = 'newtestuser';
    select * from svv_default_privileges where schema_name = 'newtestschema';
    select * from svv_default_privileges where grantee_type = 'role';

    Um die dem Benutzer direkt erteilten Berechtigungen zu überprüfen, führe als Superuser die folgende Abfrage aus:

    SELECT * FROM svv_relation_privileges where identity_name = 'newtestuser';

Beispiellösung

Das folgende Beispiel beginnt mit dieser Konfiguration:

  • Ein Benutzer namens newtestuser, der kein Superuser ist.
  • Ein Schema namens newtestschema und eine Tabelle namens newtesttable1 unter dem Schema mit einigen Datensätzen.

Ein Superuser namens awsuser gewährt dem newtestuser Zugriff auf das Schema newtestschema und auf alle Tabellen, die derzeit unter dem Schema vorhanden sind. Um Zugriff zu gewähren, verwendet awsuser den folgenden Beispielbefehl:

grant usage on schema newtestschema to newtestuser;
grant select on all tables in schema newtestschema to newtestuser;

Der Befehl gewährt dem newtestuser SELECT-Zugriff auf die aktuellen Tabellen, die unter dem newtestschema vorhanden sind. Derzeit ist nur die Tabelle newtesttable1 unter dem newtestschema vorhanden. Daher ist die Tabelle newtesttable1 für den newtestuser zugänglich.

Als Nächstes erstellt awsuser eine weitere Tabelle mit dem Namen newtesttable2 unter dem newtestschema. Wenn newtestuser eine SELECT-Abfrage für die Tabelle newtestschema.newtesttable2 ausführt, wird der folgende Fehler angezeigt:

ERROR: permission denied for relation newtesttable2.

Um den Fehler zu beheben, führt awsuser die folgenden Schritte aus:

  1. Gewährt Zugriff auf die Tabelle newtesttable2. Dazu führt awsuser den folgenden Beispielbefehl aus:

    grant select on table newtestschema.newtesttable2 to newtestuser;
  2. Gewährt dem newtestuser Zugriff auf alle zukünftigen Tabellen, die von awsuser unter dem newtestschema erstellt wurden. Dazu führt awsuser den folgenden Beispielbefehl aus:

    alter default privileges for user awsuser in schema newtestschema grant select on tables to newtestuser;

    Wenn awsuser nun eine weitere neue Tabelle mit dem Namen newtesttable3 unter dem newtestschema erstellt, hat newtestuser SELECT-Zugriff auf die Tabelle newtesttable3.

  3. Um zu überprüfen, ob dem newtestuser Standardberechtigungen gewährt wurden, führt awsuser die folgende Abfrage aus:

    select * from svv_default_privileges where grantee_name = 'newtestuser';
    select * from svv_default_privileges where schema_name = 'newtestschema';
    select * from svv_default_privileges where grantee_type = 'role';

    Um die Berechtigungen zu überprüfen, die dem newtestuser direkt gewährt wurden, führt awsuser die folgende Abfrage aus:

    SELECT * from svv_relation_privileges where identity_name = 'newtestuser';

    Die Ausgabe zeigt, dass awsuser dem newtestuser SELECT-Berechtigungen für alle neuen Tabellen gewährt, die von awsuser im newtestschema erstellt wurden.

    schema_name | object_type | owner_id | owner_name | owner_type | privilege_type | grantee_id | grantee_name | grantee_type | admin_option
    newtestschema | RELATION | 100 | awsuser | user | SELECT | 101 | newtestuser | user | FALSE

Ähnliche Informationen

PG_DEFAULT_ACL

AWS OFFICIAL
AWS OFFICIALAktualisiert vor 4 Monaten