it-swarm.com.de

Geben Sie einem Benutzer in einer Datenbank alle Berechtigungen

Ich möchte einem Benutzer alle Berechtigungen für eine Datenbank erteilen, ohne ihn zum Administrator zu machen. Der Grund, warum ich das tun möchte, ist, dass im Moment DEV und PROD unterschiedliche DBs im selben Cluster sind, so dass ich nicht möchte, dass ein Benutzer Produktionsobjekte ändern kann, sondern dass er Objekte in DEV ändern kann.

Ich habe es versucht:

grant ALL on database MY_DB to group MY_GROUP;

aber es scheint keine Erlaubnis zu geben.

Dann habe ich versucht:

grant all privileges on schema MY_SCHEMA to group MY_GROUP;

und es scheint mir die Erlaubnis zu geben, Objekte zu erstellen, aber keine Objekte in diesem Schema abzufragen oder zu löschen, die anderen Benutzern gehören

Ich könnte fortfahren, indem ich dem Benutzer auf MY_SCHEMA die Berechtigung USAGE erteile, aber dann würde er sich darüber beschweren, dass er keine Berechtigungen für die Tabelle hat ...

Meine Frage lautet also: Gibt es eine einfache Möglichkeit, einem Benutzer alle Berechtigungen für eine Datenbank zu erteilen?

Ich arbeite an PostgreSQL 8.1.23.

167
Diego

Der Benutzer benötigt Zugriff auf die Datenbank , offensichtlich:

GRANT CONNECT ON DATABASE my_db TO my_user;

Und (zumindest) das Privileg USAGE für das Schema :

GRANT USAGE ON SCHEMA public TO my_user;

Dann alle Berechtigungen für alle Tabellen (erfordert Postgres 9.0 oder höher):

GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO my_user;

Und vergiss nicht Sequenzen (falls vorhanden):

GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO my_user;

Für ältere Versionen können Sie den "Grant Wizard" von pgAdmin III (die Standard-GUI) verwenden.

Mehr:

Aber wirklich, sollten Sie pgrade auf eine aktuelle Version .

203
GRANT ALL PRIVILEGES ON DATABASE "my_db" to my_user;
109
Unkas

In PostgreSQL 9.0+ würden Sie Folgendes tun:

GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA MY_SCHEMA TO MY_GROUP;
GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA MY_SCHEMA TO MY_GROUP;

Wenn Sie dies auch für neu erstellte Beziehungen aktivieren möchten, legen Sie die Standardberechtigungen fest:

ALTER DEFAULT PRIVILEGES IN SCHEMA MY_SCHEMA
  GRANT ALL PRIVILEGES ON TABLES TO MY_GROUP;
ALTER DEFAULT PRIVILEGES IN SCHEMA MY_SCHEMA
  GRANT ALL PRIVILEGES ON SEQUENCES TO MY_GROUP;

Da Sie jedoch 8.1 verwenden, müssen Sie es selbst codieren:

CREATE FUNCTION grant_all_in_schema (schname name, grant_to name) RETURNS integer AS $$
DECLARE
  rel RECORD;
BEGIN
  FOR rel IN
    SELECT c.relname
    FROM pg_class c
    JOIN pg_namespace s ON c.namespace = s.oid
    WHERE s.nspname = schname
  LOOP
    EXECUTE 'GRANT ALL PRIVILEGES ON ' || quote_ident(schname) || '.' || rel.relname || ' TO ' || quote_ident(grant_to);
  END LOOP;
  RETURN 1;
END; $$ LANGUAGE plpgsql STRICT;
REVOKE ALL ON FUNCTION grant_all_in_schema(name, name) FROM PUBLIC;

Dadurch werden die Berechtigungen für alle Beziehungen festgelegt: Tabellen, Ansichten, Indizes, Sequenzen usw. Wenn Sie dies einschränken möchten, filtern Sie nach pg_class.relkind. Weitere Informationen finden Sie in den pg_class docs .

Sie sollten diese Funktion als Superuser und so regelmäßig ausführen, wie es Ihre Anwendung erfordert. Eine Option wäre, dies in einen Cron-Job zu packen, der jeden Tag oder jede Stunde ausgeführt wird.

47
Patrick

Ich habe Folgendes getan, um eine Rolle 'eSumit' in der PostgreSQL 9.4.15-Datenbank hinzuzufügen und alle Berechtigungen für diese Rolle bereitzustellen:

CREATE ROLE eSumit;

GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO eSumit;

GRANT ALL PRIVILEGES ON DATABASE "postgres" to eSumit;

ALTER USER eSumit WITH SUPERUSER;

Überprüfen Sie auch die pg_table-Eingaben über:

wähle * aus pg_roles; enter image description here

Momentaufnahme der Datenbankabfragen: enter image description here

20
Sumit Arora