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.