it-swarm.com.de

Gewähren Sie einer Gruppenrolle in PostgreSQL alle Elemente in einem bestimmten Schema in der Datenbank

Mit PostgreSQL 9.0 habe ich eine Gruppenrolle namens "staff" und möchte dieser Rolle alle (oder bestimmte) Berechtigungen für Tabellen in einem bestimmten Schema erteilen. Keine der folgenden Arbeiten

GRANT ALL ON SCHEMA foo TO staff;
GRANT ALL ON DATABASE mydb TO staff;

Mitglieder von "staff" können für die einzelnen Tabellen im Schema "foo" oder (im Fall des zweiten Befehls) für eine Tabelle in der Datenbank immer noch keine SELECT- oder UPDATE-Anweisung ausführen sofern nicht I grant alles auf diesem spezifischen Tisch.

Was kann ich tun, um mein Leben und das meiner Benutzer zu erleichtern?

Update: Habe es mit Hilfe von einer ähnlichen Frage auf serverfault.com herausgefunden.

GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA foo TO staff;
75
punkish

Sie haben die Kurzform gefunden, um Berechtigungen für alle vorhandenen Tabellen im angegebenen Schema festzulegen. Das Handbuch verdeutlicht :

(Beachten Sie jedoch, dass ALL TABLESviews und foreign tables enthält).

Meine kühne Betonung. serial Spalten werden mit nextval() in einer Sequenz als Spaltenvorgabe implementiert und nter Bezugnahme auf das Handbuch :

Für Sequenzen ermöglicht dieses Privileg die Verwendung der Funktionen currval und nextval.

Wenn es also serial Spalten gibt, möchten Sie auch USAGE (oder ALL PRIVILEGES) Für Sequenzen gewähren

GRANT USAGE ON ALL SEQUENCES IN SCHEMA foo TO mygrp;

Hinweis: Identitätsspalten In Postgres 10 oder höher werden implizite Sequenzen verwendet, für die keine zusätzlichen Berechtigungen erforderlich sind. (Erwägen Sie, serial Spalten zu aktualisieren.)

Was ist mit neu Objekten?

Sie werden auch interessiert sein an DEFAULT PRIVILEGES für Benutzer oder Schemata :

ALTER DEFAULT PRIVILEGES IN SCHEMA foo GRANT ALL PRIVILEGES ON TABLES TO staff;
ALTER DEFAULT PRIVILEGES IN SCHEMA foo GRANT USAGE          ON SEQUENCES TO staff;
ALTER DEFAULT PRIVILEGES IN SCHEMA foo REVOKE ...;

Hiermit werden Berechtigungen für Objekte festgelegt, die zukünftig automatisch erstellt werden, jedoch nicht für bereits vorhandene Objekte.

Standardberechtigungen gelten only für Objekte, die vom Zielbenutzer erstellt wurden (FOR ROLE my_creating_role). Wenn diese Klausel weggelassen wird, führt der aktuelle Benutzer standardmäßig ALTER DEFAULT PRIVILEGES Aus. Um es deutlich auszudrücken:

ALTER DEFAULT PRIVILEGES FOR ROLE my_creating_role IN SCHEMA foo GRANT ...;
ALTER DEFAULT PRIVILEGES FOR ROLE my_creating_role IN SCHEMA foo REVOKE ...;

Beachten Sie auch, dass alle Versionen von pgAdmin III einen subtilen Fehler aufweisen und im SQL-Bereich die Standardberechtigungen display enthalten, auch wenn sie nicht für die aktuelle Rolle gelten. Stellen Sie sicher, dass Sie die FOR ROLE - Klausel manuell anpassen, wenn Sie das SQL-Skript kopieren.

103

Meine Antwort ist ähnlich wie diese auf ServerFault.com .

Konservativ sein

Wenn Sie konservativer sein möchten, als "alle Berechtigungen" zu gewähren, sollten Sie etwas Ähnliches ausprobieren.

GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA public TO some_user_;
GRANT EXECUTE ON ALL FUNCTIONS IN SCHEMA public TO some_user_;

Die Verwendung von public bezieht sich auf den Namen des Standardschemas, das für jede neue Datenbank/jeden neuen Katalog erstellt wird. Ersetzen Sie durch Ihren eigenen Namen, wenn Sie ein Schema erstellt haben.

Zugriff auf das Schema

Um überhaupt auf ein Schema zuzugreifen, müssen dem Benutzer für jede Aktion Nutzungsrechte gewährt werden. Bevor ein Benutzer auswählen, einfügen, aktualisieren oder löschen kann, muss einem Benutzer zunächst die "Verwendung" eines Schemas gewährt werden.

Sie werden diese Anforderung nicht bemerken, wenn Sie Postgres zum ersten Mal verwenden. Standardmäßig hat jede Datenbank ein erstes Schema mit dem Namen public. Und jedem Benutzer wurden standardmäßig automatisch Nutzungsrechte für dieses bestimmte Schema gewährt. Wenn Sie ein zusätzliches Schema hinzufügen, müssen Sie die Nutzungsrechte explizit gewähren.

GRANT USAGE ON SCHEMA some_schema_ TO some_user_ ;

Auszug aus dem Postgres doc :

Ermöglicht für Schemas den Zugriff auf Objekte, die im angegebenen Schema enthalten sind (vorausgesetzt, die eigenen Berechtigungsanforderungen der Objekte werden ebenfalls erfüllt). Im Wesentlichen ermöglicht dies dem Berechtigten, Objekte innerhalb des Schemas nachzuschlagen. Ohne diese Erlaubnis ist es immer noch möglich, die Objektnamen zu sehen, z. durch Abfragen der Systemtabellen. Nach dem Widerruf dieser Berechtigung verfügen vorhandene Backends möglicherweise über Anweisungen, die diese Suche zuvor durchgeführt haben. Dies ist daher keine vollständig sichere Methode, um den Objektzugriff zu verhindern.

Weitere Informationen finden Sie in der Frage Was genau macht GRANT USAGE ON SCHEMA? . Achten Sie besonders auf die Antwort vom Postgres-Experten Craig Ringer .

Bestehende Objekte versus Zukunft

Diese Befehle wirken sich nur auf vorhandene Objekte aus. Tabellen und solche, die Sie in Zukunft erstellen, erhalten Standardberechtigungen, bis Sie die obigen Zeilen erneut ausführen. Siehe andere Antwort von Erwin Brandstetter , um die Standardeinstellungen zu ändern und damit zukünftige Objekte zu beeinflussen.

37
Basil Bourque