Wie kann ich Berechtigungen für neu erstellte Objekte in Amazon Redshift erteilen?

Lesedauer: 4 Minute
0

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

Kurzbeschreibung

Damit ein Benutzer auf neu erstellte Objekte im Schema zugreifen kann, müssen Berechtigungen für die Objekte von einem Superuser erteilt werden.

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

ERROR: permission denied for relation “objectname”.

Dieser Fehler tritt auf, wenn Zugriff nur für die aktuellen Objekte erteilt wird, die in einem Schema vorhanden waren, als der Zugriff erteilt wurde. Standardmäßig wird der Zugriff nicht automatisch für zukünftige Objekte erteilt, die unter dem Schema erstellt werden.

Um dieses Problem zu beheben, erteilen Sie dem Benutzer Zugriffsrechte mithilfe des Befehls ALTER DEFAULT PRIVILEGES.

Lösung

Um Berechtigungen für die aktuelle und zukünftige Tabelle im Schema zu erteilen, führen Sie als Superuser die folgenden Schritte aus:

1.    Führen Sie die folgenden Befehle aus, um Nutzungszugriff auf das Schema und SELECT-Zugriff auf alle Tabellen zu erteilen, die derzeit unter dem Schema vorhanden sind:
Hinweis: Ersetzen Sie newtestschema durch den Namen Ihres 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.    Um dem Benutzer SELECT-Zugriff auf zukünftige Tabellen, die unter dem Schema erstellt werden, zu erteilen, führen Sie den folgenden Befehl aus: Hinweis: Ersetzen Sie awsuser durch den Benutzernamen, der zum Erstellen zukünftiger Objekte unter dem Schema verwendet wird, newtestschema mit dem Schemanamen und newtestuser mit dem 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. Durch Ausführen von ALTER DEFAULT PRIVILEGES werden die Berechtigungen für vorhandene Objekte nicht geändert.

3.    Um zu überprüfen, ob dem Benutzer Standardberechtigungen erteilt wurden, führen Sie die folgende Abfrage als Superuser aus:

select pg_get_userbyid(d.defacluser) as user, 
n.nspname as schema, 
case d.defaclobjtype when 'r' then 'tables' when 'f' then 'functions' end 
as object_type, 
array_to_string(d.defaclacl, ' + ')  as default_privileges 
from pg_catalog.pg_default_acl d 
left join pg_catalog.pg_namespace n on n.oid = d.defaclnamespace;

Wenn Zugriff vorhanden ist, sehen Sie in der Spalte default_privileges einen Eintrag für den Benutzer.

Wenn der Superuser nun ein neues Objekt unter dem Schema erstellt, hat der Benutzer SELECT-Zugriff auf die Tabelle.

Beispiel

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.

Der Superuser mit dem Namen awsuser erteilt newtestuser Zugriff auf das newtestschema-Schema und alle Tabellen, die derzeit unter dem Schema vorhanden sind, mit dem folgenden Beispielbefehl:

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

Der vorhergehende Befehl erteilt newtestuser den SELECT-Zugriff auf die aktuellen Tabellen, die unter dem newtestschema vorhanden sind. Derzeit ist nur die Tabelle newtesttable1 unter dem newtestschema vorhanden. Die Tabelle newtesttable1 ist für 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 der awsuser Folgendes aus:

1.    Erteilt Zugriff auf die Tabelle newtesttable2, indem der folgende Beispielbefehl ausgeführt wird:

grant select on table newtestschema.newtesttable2 to newtestuser;

2.    Erteilt newtestuser Zugriff auf alle zukünftigen Tabellen, die von awsuser unter dem newtestschema erstellt werden, indem der folgende Beispielbefehl ausgeführt wird:

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 der newtestuser SELECT-Zugriff auf newtesttable3.

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

select pg_get_userbyid(d.defacluser) as user, 
n.nspname as schema, 
case d.defaclobjtype when 'r' then 'tables' when 'f' then 'functions' end 
as object_type, 
array_to_string(d.defaclacl, ' + ')  as default_privileges 
from pg_catalog.pg_default_acl d 
left join pg_catalog.pg_namespace n on n.oid = d.defaclnamespace;

Die Ausgabe der vorherigen Abfrage ähnelt der folgenden:

user    | schema    | object_type    | default_privileges
awsuser | newtestschema    | tables    | newtestuser=r/awsuser

Die Ausgabe zeigt, dass awsuser an newtestuser SELECT-Berechtigungen für alle neuen Tabellen erteilt, die von awsuser im newtestschema erstellt werden.


Relevante Informationen

PG_DEFAULT_ACL

AWS OFFICIAL
AWS OFFICIALAktualisiert vor einem Jahr