GRANT
s auf verschiedenen Objekten sind getrennt. GRANT
Wenn Sie sich in einer Datenbank befinden, haben Sie keine GRANT
Rechte an dem darin enthaltenen Schema. In ähnlicher Weise GRANT
gewährt das Verwenden eines Schemas keine Rechte für die darin enthaltenen Tabellen.
Wenn Sie Rechte an SELECT
einer Tabelle haben, aber nicht das Recht, sie in dem Schema anzuzeigen, das sie enthält, können Sie nicht auf die Tabelle zugreifen.
Die Rechtstests werden in der folgenden Reihenfolge durchgeführt:
Do you have `USAGE` on the schema?
No: Reject access.
Yes: Do you also have the appropriate rights on the table?
No: Reject access.
Yes: Check column privileges.
Ihre Verwirrung kann sich aus der Tatsache ergeben, dass das public
Schema standardmäßig GRANT
alle Rechte an der Rolle hat public
, zu der jeder Benutzer / jede Gruppe gehört. Jeder hat also bereits Verwendung für dieses Schema.
Der Satz:
(unter der Annahme, dass auch die eigenen Berechtigungsanforderungen der Objekte erfüllt sind)
Das heißt, Sie müssen USAGE
ein Schema haben, um Objekte darin zu verwenden, aber USAGE
ein Schema allein reicht nicht aus, um die Objekte innerhalb des Schemas zu verwenden. Sie müssen auch Rechte an den Objekten selbst haben.
Es ist wie ein Verzeichnisbaum. Wenn Sie ein Verzeichnis somedir
mit einer darin enthaltenen Datei erstellen, somefile
stellen Sie es so ein, dass nur Ihr eigener Benutzer auf das Verzeichnis oder die Datei zugreifen kann (Modus im Verzeichnis rwx------
, Modus rw-------
in der Datei), und niemand anderes kann das Verzeichnis auflisten, um festzustellen, ob die Datei vorhanden ist.
Wenn Sie der Datei (Modus rw-r--r--
) weltweite Leserechte gewähren, aber die Verzeichnisberechtigungen nicht ändern würden, würde dies keinen Unterschied machen. Niemand konnte sehen Sie die Datei , um es zu lesen, weil sie nicht die Rechte , um das Verzeichnis aufzulisten.
Wenn Sie stattdessen setzen rwx-r-xr-x
auf das Verzeichnis, das Einstellen so können die Menschen das Verzeichnis aufgelistet und durchqueren , aber nicht die Dateiberechtigungen zu ändern, könnten die Menschen Liste die Datei konnte aber nicht lesen , weil sie keinen Zugriff auf die Datei haben würde.
Sie müssen beide Berechtigungen festlegen , damit Benutzer die Datei tatsächlich anzeigen können.
Gleiches in Pg. Sie benötigen sowohl Schema- USAGE
als auch Objektrechte, um eine Aktion für ein Objekt auszuführen, z. B. SELECT
aus einer Tabelle.
(Die Analogie fällt insofern ein wenig insofern, als PostgreSQL noch keine Sicherheit auf Zeilenebene hat, sodass der Benutzer immer noch "sehen" kann, dass die Tabelle im Schema vorhanden ist, indem er direkt von dort SELECT
aus pg_class
. Sie können in keiner Weise mit ihr interagieren Es ist jedoch nur der "Listen" -Teil, der nicht ganz gleich ist.)
CREATE EXTENSION
. Es ist mehr oder weniger das gleiche Problem mit Dateien, die unter Linux erstellt wurden, während Sie sindsu
. Es ist gut, wenn essudo -e
in pqsl eine Art for-Anweisungen gibt.GRANT
Anweisungen, die nicht spezifisch für Tabellen sind, nicht das sind, was ich will, da sie alle Datenbanken betreffen ...: sGRANT
in einem Schema wirkt sich auf dieses Schema aus.GRANT ... ON ALL TABLES IN SCHEMA ...
wirkt sich auf alle Tabellen in einem Schema in einer bestimmten Datenbank aus. Es gibt keineGRANT
s, die alle Datenbanken betreffen (ok, außer dieGRANT
Rollenmitgliedschaft für einen Benutzer).psql
ohne eine-d db
Datenbank "außerhalb" arbeiten, aber immer mit einer Datenbank verbunden sind und standardmäßig mit der Datenbank mit demselben Namen wie Ihre Rolle verbunden sind. db = Rolle = Benutzer = Gruppe ... es ist ein bisschen verwirrend: DWITH LOGIN
; Im Wesentlichen kann alles eine Gruppe sein, und Gruppen können so eingestellt werden, dass sie sich anmelden können.Für ein Produktionssystem können Sie diese Konfiguration verwenden:
quelle
admin
auch fürCREATE
das Schema gewährt werden ?GRANT USAGE ON SCHEMA
kann der Administrator keine Tabelle erstellen, aber er kann es mitALL GRANT ALL ON SCHEMA
...grant all on schema public to admin
? PS: Ich habe auch hinzugefügtgrant usage, select on all sequences in schema public to read_only/read_write;
grant execute on all functions in schema public to read_only/read_write;
Nun, dies ist meine endgültige Lösung für eine einfache Datenbank für Linux:
quelle