Gewähren Sie Verwendung / Auswahl für eine einzelne Tabelle
Wenn Sie einer Datenbank nur CONNECT gewähren, kann der Benutzer eine Verbindung herstellen, hat jedoch keine anderen Berechtigungen. Sie müssen USAGE für Namespaces (Schemas) und SELECT für Tabellen und Ansichten wie folgt gewähren:
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 / Ansichten (PostgreSQL 9.0+)
In den neuesten Versionen von PostgreSQL können Sie Berechtigungen für alle Tabellen / Ansichten / usw. 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. Leistungsstärker können Sie künftig automatisch Standardrollen neuen Objekten zuweisen :
ALTER DEFAULT PRIVILEGES IN SCHEMA public
GRANT SELECT ON TABLES TO xxx;
Beachten Sie, dass dies standardmäßig nur Objekte (Tabellen) betrifft, die von dem Benutzer erstellt wurden, der diesen Befehl ausgegeben hat. Er kann jedoch auch für jede Rolle festgelegt werden, in der der ausstellende Benutzer Mitglied ist. Sie erhalten jedoch nicht für alle Rollen, denen Sie angehören, Standardberechtigungen, wenn Sie neue Objekte erstellen. Es gibt also immer noch einige Probleme. Wenn Sie den Ansatz wählen, dass eine Datenbank eine Eigentümerrolle hat und Schemaänderungen als diese Eigentümerrolle ausgeführt werden, sollten Sie dieser Eigentümerrolle Standardberechtigungen zuweisen. IMHO ist das alles etwas verwirrend und Sie müssen möglicherweise experimentieren, um einen funktionierenden Workflow zu entwickeln.
Mehrere Tabellen / Ansichten (PostgreSQL-Versionen vor 9.0)
Um Fehler bei langwierigen Änderungen mit mehreren Tabellen zu vermeiden, wird empfohlen, den folgenden "automatischen" Prozess zu verwenden, um die GRANT SELECT
für jede Tabelle / Ansicht erforderlichen Daten zu generieren :
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 alle Tabellen, Ansichten und Sequenzen in der Öffentlichkeit an GRANT SELECT ausgeben, um die Liebe zum Kopieren und Einfügen zu gewährleisten. Dies gilt natürlich nur für bereits erstellte Tabellen.