Zunächst müssen Sie eine Verbindung zur Datenbank herstellen können, um Abfragen ausführen zu können. Dies kann erreicht werden durch
REVOKE CONNECT ON DATABASE your_database FROM PUBLIC;
GRANT CONNECT
ON DATABASE database_name
TO user_name;
Das REVOKE
ist nötig weil
Das Schlüsselwort PUBLIC gibt an, dass die Berechtigungen für alle Rollen erteilt werden sollen, einschließlich der Rollen, die später erstellt werden. PUBLIC kann als implizit definierte Gruppe betrachtet werden, die immer alle Rollen enthält. Jeder bestimmten Rolle werden die Summe der direkt zugewiesenen Berechtigungen, der Berechtigungen für jede Rolle, der sie gegenwärtig angehört, und der PUBLIC zugewiesenen Berechtigungen zugewiesen.
Wenn Sie Ihren Benutzer wirklich auf DML-Anweisungen beschränken möchten, müssen Sie ein wenig mehr tun:
REVOKE ALL
ON ALL TABLES IN SCHEMA public
FROM PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE
ON ALL TABLES IN SCHEMA public
TO user_name;
Hierbei wird davon ausgegangen, dass Sie nur ein Schema haben (das standardmäßig den Namen "public" trägt).
Wie Jack Douglas betonte, gibt das Obige nur die Privilegien für die bereits existierenden Tische. Um dasselbe für zukünftige Tabellen zu erreichen, müssen Sie Standardberechtigungen definieren :
ALTER DEFAULT PRIVILEGES
FOR ROLE some_role -- Alternatively "FOR USER"
IN SCHEMA public
GRANT SELECT, INSERT, UPDATE, DELETE ON TABLES TO user_name;
Hier some_role
ist eine Rolle, die die Tabellen erstellt, während user_name
diejenige, die die Berechtigungen erhält. Um dies zu definieren, müssen Sie als some_role
Mitglied angemeldet sein .
Und schließlich müssen Sie dasselbe für die Sequenzen tun (danke an PlaidFan für den Hinweis) - hier ist es das USAGE
Privileg, das Sie brauchen.
FOR some_role
war der Schlüsselteil, den ich vermisst habe, damit es für meine später erstellten Tabellen funktioniert. Aber ich musste nicht eingeloggt seinsome_role
, es funktionierte auch, wenn ich die Abfrage als Standardadministrator ausführtepostgres
.