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

91

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 gewähren. Keine der folgenden Arbeiten

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

Mitglieder von "staff" können die einzelnen Tabellen im Schema "foo" oder (im Fall des zweiten Befehls) keine Tabelle in der Datenbank auswählen oder aktualisieren, es sei denn, ich erteile alle für diese bestimmte Tabelle.

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

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

GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA foo TO staff;
punkig
quelle

Antworten:

120

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

(aber beachten Sie, dass in ALL TABLESBetracht gezogen wird , umfassen Ansichten und ausländische Tabellen ).

Meine kühne Betonung. serialSpalten werden mit nextval()einer Sequenz als Spaltenstandard implementiert und zitieren das Handbuch :

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

Wenn also serialSpalten vorhanden sind , möchten Sie auch Sequenzen gewähren USAGE(oder ALL PRIVILEGES)

GRANT USAGE ON ALL SEQUENCES IN SCHEMA foo TO mygrp;

Hinweis: Identitätsspalten in Postgres 10 oder höher verwenden implizite Sequenzen, für die keine zusätzlichen Berechtigungen erforderlich sind. (Erwägen Sie das Aktualisieren von serialSpalten.)

Was ist mit neuen Objekten?

Sie interessieren sich auch DEFAULT PRIVILEGESfü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 ...;

Dadurch werden Berechtigungen für Objekte festgelegt, die in Zukunft automatisch erstellt werden - jedoch nicht für bereits vorhandene Objekte.

Standardberechtigungen werden nur auf Objekte angewendet, die vom Zielbenutzer erstellt wurden ( FOR ROLE my_creating_role). Wenn diese Klausel weggelassen wird, wird standardmäßig der aktuelle Benutzer ausgeführt ALTER DEFAULT PRIVILEGES. Um explizit zu sein:

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 Standardberechtigungen im SQL-Bereich anzeigen , auch wenn sie nicht für die aktuelle Rolle gelten. Stellen Sie sicher, dass Sie die FOR ROLEKlausel beim Kopieren des SQL-Skripts manuell anpassen .

Erwin Brandstetter
quelle
2
Nur damit du Erwin kennst, 10 Minuten nachdem du deinen Rat gepostet hast, brauchte ich ihn. Es ist, als wüssten Sie, was ich tun würde ... erstellen Sie eine neue Tabelle und stellen Sie fest, dass sie nicht die richtigen Privilegien hat. Ihre Antwort kam zur Rettung.
Punkish
5
@punkish: Ich fordere mein Precog-Abzeichen! Verdammt, das wird schon für etwas anderes verwendet.
Erwin Brandstetter
ALTER DEFAULT PRIVILEGES IN SCHEMA foo GRANT ALL PRIVILEGES ON TABLES TO staff;Woher weiß es beim Ausführen , welche Datenbank? SCHEMA fookann in verschiedenen Datenbanken existieren?
J86
2
@ J86: Gilt nur für die aktuelle Datenbank, in der der Befehl ausgeführt wird.
Erwin Brandstetter
1
@ErwinBrandstetter Kann ich dem app_user (Lese- / Schreibzugriff) Zugriff für zukünftige Tabellen / Sequenzen gewähren (vorausgesetzt, Tabellen werden automatisch von einem anderen dedizierten migrationsbenutzer erstellt (Flyway-Migrationen werden beim Start der App ausgeführt)?
Lexem
42

Meine Antwort ähnelt der 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 publicdort bezieht sich auf den Namen des Standardschemas, das für jede neue Datenbank / jeden neuen Katalog erstellt wurde. Ersetzen Sie durch Ihren eigenen Namen, wenn Sie ein Schema erstellt haben.

Zugriff auf das Schema

Um überhaupt auf ein Schema zugreifen zu können, muss 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 eine "Verwendung" für ein Schema gewährt werden.

Sie werden diese Anforderung bei der ersten Verwendung von Postgres nicht bemerken. Standardmäßig hat jede Datenbank ein erstes Schema mit dem Namen public. Standardmäßig wurden jedem Benutzer automatisch "Nutzungsrechte" für dieses bestimmte Schema gewährt. Wenn Sie ein zusätzliches Schema hinzufügen, müssen Sie explizit Nutzungsrechte gewähren.

GRANT USAGE ON SCHEMA some_schema_ TO some_user_ ;

Auszug aus dem Postgres-Dokument :

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). Dies ermöglicht es dem Berechtigten im Wesentlichen, Objekte innerhalb des Schemas nachzuschlagen. Ohne diese Berechtigung können die Objektnamen weiterhin angezeigt werden, z. B. 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 also 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 des Postgres-Experten Craig Ringer .

Bestehende Objekte versus Zukunft

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

Basil Bourque
quelle
1
Zusätzlich zu den beiden oben genannten Zuschüssen benötigen Sie einen weiteren Zuschuss: GRANT USAGE ON SCHEMA public TO some_user_;
Ning Liu
1
@NingLiu Vielen Dank, dass Sie auf GRANT USAGE hingewiesen und mir das beigebracht haben. Ich habe der Antwort einen Abschnitt hinzugefügt.
Basil Bourque
GRANT USAGE ON SCHEMA ist das, wonach ich gesucht habe.
Basil Musa