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

PostgreSQL:Geben Sie einem Benutzer alle Berechtigungen für eine PostgreSQL-Datenbank

Alle Befehle müssen ausgeführt werden, während sie mit dem richtigen Datenbank-Cluster verbunden sind. Überzeugen Sie sich davon.

Rollen sind Objekte des Clusters der Datenbank . Alle Datenbanken desselben Clusters teilen sich den Satz definierter Rollen. Privilegien werden pro Datenbank/Schema/Tabelle etc. gewährt/entzogen.

Eine Rolle benötigt Zugriff auf die Datenbank , offensichtlich. Das wird PUBLIC gewährt standardmäßig. Sonst:

GRANT CONNECT ON DATABASE my_db TO my_user;

Grundlegende Berechtigungen für Postgres 14 oder höher

Postgres 14 fügt die vordefinierten Nicht-Login-Rollen pg_read_all_data hinzu / pg_write_all_data .
Sie haben SELECT / INSERT , UPDATE , DELETE Privilegien für alle Tabellen, Ansichten und Sequenzen. Plus USAGE auf Schemata. Wir können GRANT Mitgliedschaft in diesen Rollen:

GRANT pg_read_all_data TO my_user;
GRANT pg_write_all_data TO my_user;

Dies deckt alle grundlegenden DML-Befehle ab (aber nicht DDL und nicht einige spezielle Befehle wie TRUNCATE oder das EXECUTE Privileg für Funktionen!). Das Handbuch:

pg_read_all_data

Lesen Sie alle Daten (Tabellen, Ansichten, Sequenzen), als ob Sie SELECT hätten Rechte an diesen Objekten und USAGE Rechte auf alle Schemas, auch ohne es explizit zu haben. Diese Rolle hat nicht das Rollenattribut BYPASSRLS einstellen. Wenn RLS verwendet wird, möchte ein Administrator möglicherweise BYPASSRLS festlegen auf Rollen, die diese Rolle GRANT ist zu bearbeiten.

pg_write_all_data

Schreiben Sie alle Daten (Tabellen, Ansichten, Sequenzen), als ob Sie INSERT hätten ,UPDATE , und DELETE Rechte an diesen Objekten und USAGE Rechte auf alle Schemas, auch ohne es explizit zu haben. Diese Rolle hat nicht das Rollenattribut BYPASSRLS einstellen. Wenn RLS verwendet wird, möchte ein Administrator möglicherweise BYPASSRLS festlegen auf Rollen, die diese RolleGRANT ist zu bearbeiten.

Alle Berechtigungen ohne Verwendung vordefinierter Rollen (jede Postgres-Version)

Befehle müssen ausgeführt werden, während eine Verbindung zur richtigen Datenbank besteht. Überzeugen Sie sich davon.

Die Rolle benötigt (mindestens) den USAGE Berechtigung für das Schema . Nochmals, wenn das PUBLIC gewährt wird , Sie sind versichert. Sonst:

GRANT USAGE ON SCHEMA public TO my_user;

Oder gewähren Sie USAGE auf alle benutzerdefinierte 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 später).
Und vergessen Sie nicht 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;

Alternativ können Sie den "Grant Wizard" von pgAdmin 4 verwenden, um mit einer GUI zu arbeiten.

Es gibt einige andere Objekte, das Handbuch für GRANT hat die komplette Liste. Ab Postgres 12:

Berechtigungen für ein Datenbankobjekt (Tabelle, Spalte, Ansicht, Fremdtabelle, Sequenz, Datenbank, Fremddaten-Wrapper, Fremdserver, Funktion, Prozedur, prozedurale Sprache, Schema oder Tablespace)

Aber der Rest wird selten benötigt. Weitere Einzelheiten:

  • Wie verwaltet man STANDARDPRIVILEGIEN für BENUTZER auf einer DATENBANK im Vergleich zu SCHEMA?
  • Gewähren Sie Berechtigungen für eine bestimmte Datenbank in PostgreSQL
  • So gewähren Sie beliebigen Benutzern alle Privilegien für Ansichten

Erwägen Sie ein Upgrade auf eine aktuelle Version.