Verwendung/Abwahl für eine einzelne Tabelle zulassen
Wenn Sie nur CONNECT für eine Datenbank gewähren, kann der Benutzer eine Verbindung herstellen, hat aber keine anderen Rechte. Sie müssen USAGE auf Namensräume (Schemata) und SELECT auf Tabellen und Ansichten einzeln gewähren, etwa so:
GRANT CONNECT ON DATABASE mydb TO xxx;
-- This assumes you're actually connected to mydb..
GRANT USAGE ON SCHEMA public TO xxx;
GRANT SELECT ON mytable TO xxx;
Mehrere Tabellen/Views (PostgreSQL 9.0+)
In den neuesten Versionen von PostgreSQL können Sie Berechtigungen für alle Tabellen/Views/etc im Schema mit einem einzigen Befehl erteilen, anstatt sie einzeln eingeben zu müssen:
GRANT SELECT ON ALL TABLES IN SCHEMA public TO xxx;
Dies betrifft nur Tabellen, die bereits erstellt wurden. Noch leistungsfähiger ist die Möglichkeit, dass Sie automatisch Standardrollen, die neuen Objekten zugewiesen werden in Zukunft:
ALTER DEFAULT PRIVILEGES IN SCHEMA public
GRANT SELECT ON TABLES TO xxx;
Beachten Sie, dass sich dies standardmäßig nur auf Objekte (Tabellen) auswirkt, die von dem Benutzer erstellt wurden, der diesen Befehl erteilt hat; es kann jedoch auch für jede Rolle festgelegt werden, der der erteilende Benutzer angehört. Allerdings erhalten Sie nicht für alle Rollen, in denen Sie Mitglied sind, Standardberechtigungen, wenn Sie neue Objekte erstellen... Sie müssen also noch etwas herumprobieren. Wenn Sie den Ansatz verfolgen, dass eine Datenbank eine Eigentümerrolle hat und Schemaänderungen als diese Eigentümerrolle durchgeführt werden, dann sollten Sie dieser Eigentümerrolle Standardberechtigungen zuweisen. IMHO ist das alles etwas verwirrend, und Sie müssen vielleicht ein wenig experimentieren, um einen funktionierenden Arbeitsablauf zu finden.
Mehrere Tabellen/Views (PostgreSQL-Versionen vor 9.0)
Um Fehler bei langwierigen, mehrere Tabellen umfassenden Änderungen zu vermeiden, wird empfohlen, den folgenden "automatischen" Prozess zu verwenden, um die erforderlichen GRANT SELECT
zu jeder Tabelle/Ansicht:
SELECT 'GRANT SELECT ON ' || relname || ' TO xxx;'
FROM pg_class JOIN pg_namespace ON pg_namespace.oid = pg_class.relnamespace
WHERE nspname = 'public' AND relkind IN ('r', 'v', 'S');
Dies sollte die relevanten GRANT-Befehle für GRANT SELECT auf alle Tabellen, Ansichten und Sequenzen in der Öffentlichkeit ausgeben, damit Sie sie kopieren und einfügen können. Natürlich wird dies nur auf Tabellen angewendet, die bereits erstellt wurden.