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

Erteilen Sie Berechtigungen für eine bestimmte Datenbank in PostgreSQL

Grundkonzept in Postgres

Rollen sind globale Objekte, die auf alle Datenbanken in einem db-Cluster zugreifen können - vorausgesetzt, die erforderlichen Berechtigungen sind gegeben.

Ein Cluster enthält viele Datenbanken , die viele Schemata enthalten . Schemas (sogar mit demselben Namen) in verschiedenen DBs sind unabhängig. Das Gewähren von Privilegien für ein Schema gilt nur für dieses bestimmte Schema in der aktuellen DB (der aktuellen DB zum Zeitpunkt der Gewährung).

Jede Datenbank beginnt mit einem Schema public standardmäßig. Das ist eine Konvention, und viele Einstellungen beginnen damit. Ansonsten das Schema public ist nur ein Schema wie jedes andere.

Wenn Sie von MySQL kommen, möchten Sie vielleicht mit einem einzelnen Schema public beginnen , wodurch die Schemaebene effektiv vollständig ignoriert wird. Ich verwende regelmäßig Dutzende von Schemas pro Datenbank.
Schemas sind ein bisschen (aber nicht vollständig) wie Verzeichnisse im Dateisystem.

Sobald Sie mehrere Schemas verwenden, müssen Sie unbedingt search_path verstehen Einstellung:

  • Wie beeinflusst der Suchpfad die Identifikatorauflösung und das "aktuelle Schema"

Standardberechtigungen

Gemäß Dokumentation zu GRANT :

PostgreSQL gewährt PUBLIC Standardberechtigungen für einige Arten von Objekten . PUBLIC werden keine Privilegien gewährt standardmäßig auf Tabellen, Spalten, Schemata oder Tablespaces. Für andere Typen die Standardprivilegien, die PUBLIC gewährt werden lauten wie folgt:CONNECT und CREATE TEMP TABLE für Datenbanken; EXECUTE Privileg für Funktionen; und USAGE Privileg für Sprachen.

Alle diese Voreinstellungen können mit ALTER DEFAULT PRIVILEGES geändert werden :

  • Gewähren Sie einer Gruppenrolle in PostgreSQL alle für ein bestimmtes Schema in der Datenbank

Gruppenrolle

Wie @Craig kommentierte, ist es am besten, GRANT Berechtigungen für eine Gruppenrolle und machen Sie dann einen bestimmten Benutzer zum Mitglied dieser Rolle (GRANT die Gruppenrolle zur Benutzerrolle). Auf diese Weise ist es einfacher, für bestimmte Aufgaben benötigte Privilegienbündel zu verteilen und zu entziehen.

Eine Gruppenrolle ist nur eine weitere Rolle ohne Anmeldung. Fügen Sie ein Login hinzu, um es in eine Benutzerrolle umzuwandeln. Mehr:

  • Warum hat PostgreSQL Benutzer und Gruppen in Rollen zusammengeführt?

Vordefinierte Rollen

Aktualisierung: Postgres 14 oder höher fügt die neuen vordefinierten Rollen (formal „Standardrollen“) pg_read_all_data hinzu und pg_write_all_data um einige der folgenden Punkte zu vereinfachen. Siehe:

  • Zugriff auf alle Tabellen einer Datenbank gewähren

Rezept

Angenommen, wir haben eine neue Datenbank mydb , eine Gruppe mygrp , und einen Benutzer myusr ...

Während Sie als Superuser mit der betreffenden Datenbank verbunden sind (postgres zum Beispiel):

REVOKE ALL ON DATABASE mydb FROM public;  -- shut out the general public
GRANT CONNECT ON DATABASE mydb TO mygrp;  -- since we revoked from public

GRANT USAGE ON SCHEMA public TO mygrp;

So weisen Sie "einem Benutzer alle Berechtigungen für alle Tabellen" zu wie Sie geschrieben haben (ich könnte restriktiver sein):

GRANT ALL ON ALL TABLES IN SCHEMA public TO mygrp;
GRANT ALL ON ALL SEQUENCES IN SCHEMA public TO mygrp; -- don't forget those

Führen Sie zum Festlegen von Standardberechtigungen für zukünftige Objekte jede Rolle aus das Objekte in diesem Schema erstellt:

ALTER DEFAULT PRIVILEGES FOR ROLE myusr IN SCHEMA public
GRANT ALL ON TABLES TO mygrp;

ALTER DEFAULT PRIVILEGES FOR ROLE myusr IN SCHEMA public
GRANT ALL ON SEQUENCES TO mygrp;

-- more roles?

Gewähren Sie nun die Gruppe dem Benutzer:

GRANT mygrp TO myusr;

Zugehörige Antwort:

  • PostgreSQL - DB-Benutzer sollten nur Funktionen aufrufen dürfen

Alternative (nicht standardmäßige) Einstellung

Da Sie von MySQL kommen und die Berechtigungen für Datenbanken getrennt halten möchten, könnte Ihnen diese nicht standardmäßige Einstellung db_user_namespace gefallen . Per Dokumentation:

Dieser Parameter aktiviert Benutzernamen pro Datenbank. Es ist standardmäßig deaktiviert.

Lesen Sie das Handbuch sorgfältig durch. Ich verwende diese Einstellung nicht. Das Obige wird dadurch nicht ungültig.