Postgresql: Was macht GRANT ALL PRIVILEGES ON DATABASE?


60

Ich versuche, einem neuen postgres-Benutzer (nicht dem Eigentümer) alle Berechtigungen für alle Tabellen einer bestimmten Datenbank zu gewähren. Es scheint, dass GRANT ALL PRIVILEGES ON DATABASE my_db TO new_user;das nicht geht. Nach erfolgreicher Ausführung des Befehls (als postgres-Benutzer) erhalte ich als new_user Folgendes:

$ psql -d my_db
my_db => SELECT * FROM a_table_in_my_db;
ERROR:  permission denied for relation a_table_in_my_db

Zwei Fragen:

1) Was macht der obige Befehl, wenn nicht alle Berechtigungen für alle Tabellen in my_db erteilt werden?

2) Wie kann ein Benutzer alle Berechtigungen für alle Tabellen ordnungsgemäß erteilen? (auch für alle zukünftig erstellten Tabellen)

Antworten:


80

Die Antworten auf Ihre Fragen stammen aus den Online-Dokumenten zu PostgreSQL 8.4 .

  1. GRANT ALL PRIVILEGES ON DATABASEdas gewährt CREATE, CONNECTund TEMPORARYBerechtigungen für eine Datenbank in eine Rolle (Benutzer korrekt bezeichnet als Rollen ). Keine dieser Berechtigungen ermöglicht es einer Rolle, Daten aus einer Tabelle zu lesen. SELECTHierfür ist ein Zugriffsrecht für die Tabelle erforderlich.

  2. Ich bin nicht sicher, ob es eine "richtige" Möglichkeit gibt, einer Rolle alle Berechtigungen für alle Tabellen zuzuweisen. Der beste Weg , um eine gegebene Rolle , um sicherzustellen , hat alle Privilegien auf einem Tisch , um sicherzustellen , dass die Rolle besitzt die Tabelle. Standardmäßig gehört jedes neu erstellte Objekt der Rolle, die es erstellt hat. Wenn Sie also möchten, dass eine Rolle alle Berechtigungen für eine Tabelle besitzt, müssen Sie diese Rolle zum Erstellen verwenden.

    PostgreSQL 9.0 führt die folgende Syntax ein, die fast Ihren Wünschen entspricht:

    GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO new_user;

    Das Problem ist, dass, wenn Sie Tabellen in Schemas außerhalb des Standardschemas "public" erstellen, dies GRANTnicht für sie gilt. Wenn Sie nicht öffentliche Schemas verwenden, müssen Sie GRANTdie Berechtigungen für diese Schemas separat festlegen.


1
Kann eine Datenbank mehrere Eigentümer haben? Wenn ja, wie füge ich einen weiteren Eigentümer hinzu?
rz.

Nein, ich glaube nicht, dass eine Datenbank mehr als einen Besitzer haben kann. Sie können ihnen jedoch alle Schreibvorgänge eines Besitzers geben
hellomynameisjoel

15
Vergessen Sie nicht, dass Sie dasselbe für Sequenzen machen müssen: GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO your_user;oder Sie können keine Datensätze einfügen.

Auch wenn es nicht funktioniert, versuchen Sie Folgendes: = GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO your_user;
Kaustubh

10

Es ist möglich, mehrere Anmeldungen als Datenbankeigentümer einzurichten:

  • Erstellen Sie eine "Nologin" -Rolle als Eigentümer: create role dbowner nologin
  • Ändern Sie den Eigentümer Ihrer Datenbank folgendermaßen: alter database mydb owner dbowner
  • Gewähren Sie all Ihren Logins diese neue Rolle: grant dbowner to user1, user2

Wenn sich nun Benutzer1 oder Benutzer2 anmelden, haben sie alle Berechtigungen für "mydb", ohne dass weitere Berechtigungen erforderlich sind.

Ich würde diese Lösung jedoch sorgfältig prüfen. Es ist verlockend, wenn Ihre Webanwendung eine dieser Anmeldungen verwendet, um zu vermeiden, dass bei jeder Aktualisierung des Schemas zusätzliche Berechtigungen erstellt werden müssen. Auf diese Weise entfernen Sie jedoch eine sehr nützliche Form des Schutzes. Verwenden Sie die obige Lösung, wenn Sie wirklich mehrere "Administratoren" möchten, aber das obige Muster "Gewähren Sie alle Berechtigungen für alle Tabellen im Schema ..." für die Anmeldung für Ihre Anwendung "für den normalen Gebrauch" einhalten möchten.


1
Chris Cogdon, nur ein kleiner Fehler: Ändern Sie den Datenbank-Mydb-Besitzer zu dbowner
user876743
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.