Geben Sie einem Benutzer in einer Datenbank alle Berechtigungen

206

Ich möchte einem Benutzer alle Berechtigungen für eine Datenbank erteilen, ohne sie zum Administrator zu machen. Der Grund, warum ich das tun möchte, ist, dass DEV und PROD im Moment unterschiedliche DBs im selben Cluster sind, sodass 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 USAGE-Berechtigung erteile, aber dann würde es sich darüber beschweren, dass keine Berechtigungen für die Tabelle vorliegen ...

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

Ich arbeite an PostgreSQL 8.1.23.

Diego
quelle

Antworten:

271

Der Benutzer benötigt natürlich Zugriff auf die Datenbank :

GRANT CONNECT ON DATABASE my_db TO my_user;

Und (zumindest) das USAGEPrivileg für das Schema :

GRANT USAGE ON SCHEMA public TO my_user;

Oder gewähren Sie USAGEfür alle benutzerdefinierten Schemas:

DO
$$
BEGIN
   -- RAISE NOTICE '%', (  -- use instead of EXECUTE to see generated commands
   EXECUTE (
   SELECT string_agg(format('GRANT USAGE ON SCHEMA %I TO my_user', nspname), '; ')
   FROM   pg_namespace
   WHERE  nspname <> 'information_schema' -- exclude information schema and ...
   AND    nspname NOT LIKE 'pg\_%'        -- ... system schemas
   );
END
$$;

Dann alle Berechtigungen für alle Tabellen (erfordert Postgres 9.0 oder höher).
Und vergessen Sie nicht die Sequenzen (falls vorhanden):

GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO my_user;
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.

Es gibt einige andere Objekte, fürGRANT die das Handbuch die vollständige Liste ab Postgres 12 enthält:

Berechtigungen für ein Datenbankobjekt (Tabelle, Spalte, Ansicht, fremde Tabelle, Sequenz, Datenbank, Wrapper für fremde Daten, fremder Server, Funktion, Prozedur, prozedurale Sprache, Schema oder Tabellenbereich)

Der Rest wird aber selten benötigt. Mehr Details:

Erwägen Sie ein Upgrade auf eine aktuelle Version .

Erwin Brandstetter
quelle
133
GRANT ALL PRIVILEGES ON DATABASE "my_db" to my_user;
Unkas
quelle
24
Alle Privilegien zu gewähren ON DATABASEklingt mächtig, macht aber nicht viel. Es ist nur ein Anfang. Es werden keine Berechtigungen für enthaltene Objekte gewährt.
Erwin Brandstetter
49

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;

Wenn 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-Dokumenten .

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.

Patrick
quelle
Hallo Patrick, "ALL TABLES" ist unter 8.1 nicht verfügbar ( postgresql.org/docs/8.1/static/sql-grant.html ). Ich weiß, dass ich die Tabellen durchlaufen und die Berechtigungen einzeln erteilen kann, aber das bin ich versuchen zu vermeiden. aber danke für Ihre Hilfe
Diego
@Diego: Lösung für 8.1 hinzugefügt
Patrick
danke patrick, am ende habe ich so etwas wie du benutzt, aber nicht "GRANT ALL". Aus irgendeinem Grund scheint es nichts zu tun. Zum Beispiel habe ich ausgeführt: BenutzerA ALL beim Schematest gewähren; aber danach hat userA immer noch keinen Zugriff zum Lesen aus den Tabellen beim Schematest
Diego
2
Sie sollten die Nutzung eines Schemas gewähren. Für alle Beziehungen innerhalb dieses Schemas (Tabellen, Ansichten, Sequenzen, Indizes usw.) müssen Sie SELECT, INSERT, UPDATE, DELETE, TRUNCATE separat gewähren. Schemata sind Namespaces, Relationen sind der Ort, an dem sich Ihre Daten befinden.
Patrick
28

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

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ählen Sie * aus pg_roles; Geben Sie hier die Bildbeschreibung ein

Schnappschuss von Datenbankabfragen: Geben Sie hier die Bildbeschreibung ein

Sumit Arora
quelle
Ich habe Postgres Version 10.3 und es wird ein Syntaxfehler ausgegeben, wenn ich Anführungszeichen um den Datenbanknamen verwende.
Sajid