PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Wie erstellen Sie einen schreibgeschützten Benutzer in PostgreSQL?

Nutzung/Auswahl für eine einzelne Tabelle gewähren

Wenn Sie einer Datenbank nur CONNECT gewähren, kann der Benutzer eine Verbindung herstellen, hat aber keine anderen Berechtigungen. Sie müssen USAGE für Namensräume (Schemas) und SELECT für Tabellen und Ansichten einzeln 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 bereits erstellte Tabellen. Noch leistungsfähiger ist, dass Sie in Zukunft neuen Objekten automatisch Standardrollen zuweisen lassen können:

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:obwohl es auch für jede Rolle festgelegt werden kann, der der ausgebende Benutzer angehört. Sie erhalten jedoch nicht die Standardrechte für alle Rollen, denen Sie angehören, wenn Sie neue Objekte erstellen ... also gibt es immer noch etwas Fummelei. Wenn Sie den Ansatz verfolgen, dass eine Datenbank eine besitzende Rolle hat und Schemaänderungen als diese besitzende Rolle durchgeführt werden, sollten Sie dieser besitzenden Rolle Standardberechtigungen zuweisen. IMHO ist das alles etwas verwirrend und Sie müssen möglicherweise experimentieren, um einen funktionierenden Workflow zu finden.

Mehrere Tabellen/Ansichten (PostgreSQL-Versionen vor 9.0)

Um Fehler bei langwierigen Änderungen mehrerer Tabellen zu vermeiden, wird empfohlen, den folgenden "automatischen" Prozess zu verwenden, um das erforderliche GRANT SELECT zu generieren 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 an GRANT SELECT für alle Tabellen, Ansichten und Sequenzen in der Öffentlichkeit ausgeben, für die Liebe zum Kopieren und Einfügen. Dies gilt natürlich nur für bereits erstellte Tabellen.