it-swarm.com.de

Gewähren eines Zugriffs auf alle Tabellen für einen Benutzer

Ich bin neu bei Postgres und versuche, unsere MySQL-Datenbanken zu migrieren. In MySQL kann ich einem Benutzer mit niedrigen Berechtigungen die Berechtigungen SELECT, UPDATE, INSERT und DELETE gewähren und diese Berechtigungen für alle Tabellen in a aktivieren angegebene Datenbank. Ich muss etwas in Postgres vermissen, weil es so aussieht, als müsste ich diese Berechtigungen für jede Tabelle einzeln gewähren. Bei vielen Datenbanken und Hunderten von Tabellen pro Datenbank scheint dies eine entmutigende Aufgabe zu sein, nur um in Gang zu kommen. Sobald eine Datenbank in Betrieb ist, werden Tabellen häufig genug hinzugefügt, sodass ich nicht jedes Mal Berechtigungen erteilen möchte, es sei denn, dies ist unbedingt erforderlich.

Wie wird dies am besten erreicht?

158
PlaidFan

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 notwendig weil

Das Schlüsselwort PUBLIC gibt an, dass die Berechtigungen allen Rollen gewährt werden sollen, einschließlich derjenigen, die möglicherweise später erstellt werden. PUBLIC kann als implizit definierte Gruppe betrachtet werden, die immer alle Rollen umfasst. Für eine bestimmte Rolle wird die Summe der direkt gewährten Berechtigungen, der Berechtigungen für jede Rolle, der sie derzeit angehört, und der PUBLIC gewährten Berechtigungen gewährt.

Wenn Sie Ihren Benutzer wirklich auf DML-Anweisungen beschränken möchten, haben Sie ein wenig mehr zu 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;

Diese setzen voraus, dass Sie nur ein Schema haben (das standardmäßig 'public' heißt).

Wie Jack Douglas betonte, gibt das Obige nur die Berechtigungen für die bereits vorhandenen Tabellen an. 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 ist some_role Eine Rolle, die die Tabellen erstellt, während user_name Die Berechtigungen erhält. Um dies zu definieren, müssen Sie als some_role Oder als 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 benötigen.

180
dezso

angenommen, Sie möchten ihnen alle Berechtigungen gewähren - gehen Sie folgendermaßen vor:

grant all privileges on database dbname to dbuser;

dabei ist dbname der Name Ihrer Datenbank und dbuser der Name des Benutzers.

54
alxkls

Das Gewähren aller Berechtigungen für alle Tabellen in der Datenbank wird mit erreicht

GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA <schema_name> TO <username>;
GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA <schema_name> TO <username>;
22
Nomadme

Es kann sein, dass ich hier etwas falsch gemacht habe, da ich sehr neu in PostgreSQL bin. Dies löste jedoch nur den ersten Teil des Problems für mich - das Festlegen der Berechtigungen für alle vorhandenen Tabellen.

Damit die Berechtigungen für meinen Benutzer für neue Tabellen, die erstellt werden, korrekt festgelegt werden, muss ich Standardberechtigungen für den Benutzer festlegen:

ALTER DEFAULT PRIVILEGES IN SCHEMA public
  GRANT SELECT, INSERT, UPDATE, DELETE ON tables TO user_name;

ALTER DEFAULT PRIVILEGES IN SCHEMA public
  GRANT SELECT, USAGE ON sequences TO user_name;
18
Will
--Create User

CREATE USER my_user_test WITH LOGIN NOSUPERUSER NOCREATEDB  NOCREATEROLE    INHERIT NOREPLICATION   CONNECTION LIMIT -1 PASSWORD 'xxxxxxx';

-- Grant connect to my data base

GRANT CONNECT ON DATABASE my_db_test TO my_user_test;

-- Grant usage the schema

GRANT USAGE ON SCHEMA my_sch_test TO my_user_test ;

-- Grant all table for SELECT, INSERT, UPDATE, DELETE

GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA my_sch_test TO my_user_test;
3