2012-05-08 10 views
18

Wie gewähren Sie einem beliebigen Benutzer Lese-/Auswahlzugriff auf alle Funktionen und Sichten?So gewähren Sie einem Benutzer alle Berechtigungen für Sichten

Ich benutze psql --user=postgres -d mydb -f myview.sql mehrere Funktionen und Ansichten zu erstellen, und dann laufe ich:

GRANT ALL PRIVILEGES ON DATABASE mydb TO myuser; 

alle Privilegien gewährt wurde, würde ich myuser erwarte nun Zugang haben zu den Funktionen und Ansichten von den postgres Benutzern erstellt . Wenn ich jedoch versuche, mit myuser auf sie zuzugreifen, erhalte ich den Fehler "Berechtigung verweigert für Relation ...". Warum ist das?

Antwort

25

Der Grund ist, dass Sie zusätzliche Berechtigungen benötigen, um auf eine Ansicht oder Tabelle zuzugreifen. Berechtigungen für die Datenbank decken nicht den Zugriff auf alle darin enthaltenen Objekte ab.

Es ist anders mit Funktionen: EXECUTE Privileg ist public standardmäßig gewährt. Aber Die Funktion wird mit den Rechten des aktuellen Benutzers ausgeführt. Möglicherweise interessiert Sie der SECURITY DEFINER Modifikator für CREATE FUNCTION. Aber normalerweise genügt es, SELECT auf beteiligten Tabellen zu gewähren.

Per documentation about default privileges:

Je nach Art des Objekts umfassen die anfänglichen Standardberechtigungen könnten einige Privilegien zu PUBLIC gewähren. Der Standardwert ist kein öffentlicher Zugriff für Tabellen, Spalten, Schemas und Tablespaces. CONNECT Privileg und TEMP Tabellenerstellungsberechtigung für Datenbanken; EXECUTE Privileg für Funktionen; und USAGE Privileg für Sprachen.

Sie können in diesem DDL-Befehl interessiert sein (erfordert Postgres 9.0 oder höher):

GRANT SELECT ON ALL TABLES IN SCHEMA public TO myuser; 

Während der Verbindung mit der Datenbank in Frage, natürlich (@marcel's comment siehe unten), und als Benutzer mit ausreichenden Berechtigungen.

Weitere ausführliche Antwort, wie die Verwaltung Privilegien:

pgAdmin verfügt über eine Funktion Sie können auch in der Einstellung DEFAULT PRIVILEGES interessiert sein f oder anspruchsvollere Bulk-Operationen:

enter image description here

Oder Sie können die Systemkataloge Abfrage DDL-Anweisungen für Bulk-Gewährung/Widerrufung zu schaffen ...

+2

Es dauerte eine Stunde, um zu erkennen, dass "GRANT SELECT auf allen Tabellen in SCHEMA öffentlichen TO myuser;" macht nur Sinn, wenn dieser Befehl ausgeführt wird, wenn der Benutzer * CONNECTED * an diese Datenbank sendet. Wenn nicht, tut es nichts (oder es gibt dem Benutzer keine Auswahlberechtigung). Verwenden Sie in der Shell des Superusers \ c Datenbankname. – marcel

+0

@marcel: Ich habe eine Notiz hinzugefügt, um die Leute daran zu erinnern. –

+0

Dies erteilt dem Benutzer keine Berechtigung für Sequenzen. – Cerin

Verwandte Themen