it-swarm.com.de

Postgresql: Was macht GRANT ALL PRIVILEGES ON DATABASE?

Ich versuche, einem neuen Postgres-Benutzer (nicht dem Eigentümer) alle Berechtigungen für alle Tabellen einer bestimmten Datenbank zu erteilen. Es scheint, dass GRANT ALL PRIVILEGES ON DATABASE my_db TO new_user; macht das nicht. Nachdem ich diesen Befehl erfolgreich ausgeführt habe (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 dann, wenn nicht alle Berechtigungen für alle Tabellen in my_db erteilt werden?

2) Wie kann einem Benutzer alle Berechtigungen für alle Tabellen erteilt werden? (einschließlich aller in der Zukunft erstellten Tabellen)

65
rz.

Die Antworten auf Ihre Fragen stammen aus dem Online-PostgreSQL 8.4-Dokument .

  1. GRANT ALL PRIVILEGES ON DATABASE gewährt einer Rolle die Berechtigungen CREATE, CONNECT und TEMPORARY für eine Datenbank (Benutzer werden ordnungsgemäß als Rollen bezeichnet ). Keine dieser Berechtigungen erlaubt einer Rolle tatsächlich das Lesen von Daten aus einer Tabelle. Dafür ist das Privileg SELECT für die Tabelle erforderlich.

  2. Ich bin nicht sicher, ob es einen "richtigen" Weg gibt, einer Rolle alle Berechtigungen für alle Tabellen zu gewähren. Der beste Weg, um sicherzustellen, dass eine bestimmte Rolle alle Berechtigungen für eine Tabelle hat, besteht darin, sicherzustellen, dass die Rolle die Tabelle besitzt . 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 hat, verwenden Sie diese Rolle, um sie zu erstellen.

    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, dieses GRANT nicht auf diese angewendet wird. Wenn Sie nicht öffentliche Schemas verwenden, müssen Sie die Berechtigungen für diese Schemas separat GRANT festlegen.

87
Steven Monday

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 in: alter database mydb owner dbowner
  • Gewähren Sie dieser neuen Rolle alle Ihre Anmeldungen: grant dbowner to user1, user2

Wenn sich Benutzer oder Benutzer 2 anmelden, verfügen sie über 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, dass Ihre Webanwendung eine dieser Anmeldungen verwendet, um zu vermeiden, dass bei der Aktualisierung des Schemas zusätzliche Zuschüsse 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 halten Sie sich an das obige Muster "Alle Berechtigungen für alle Tabellen im Schema gewähren ..." für die Anmeldung für Ihre Anwendung "normale Verwendung".

12
Chris Cogdon