Gewähren Sie Verwendung / Auswahl für eine einzelne Tabelle
Wenn Sie einer Datenbank nur CONNECT gewähren, kann der Benutzer eine Verbindung herstellen, hat jedoch keine anderen Berechtigungen. Sie müssen USAGE für Namespaces (Schemas) und SELECT für Tabellen und Ansichten wie folgt gewähren:
GRANT CONNECT ON DATABASE mydb TO xxx;
-- This assumes you're actually connected to mydb..
GRANT USAGE ON SCHEMA public TO xxx;
GRANT SELECT ON mytable TO xxx;
Mehrere Tabellen / Ansichten (PostgreSQL 9.0+)
In den neuesten Versionen von PostgreSQL können Sie Berechtigungen für alle Tabellen / Ansichten / usw. im Schema mit einem einzigen Befehl erteilen, anstatt sie einzeln eingeben zu müssen:
GRANT SELECT ON ALL TABLES IN SCHEMA public TO xxx;
Dies betrifft nur Tabellen, die bereits erstellt wurden. Leistungsstärker können Sie künftig automatisch Standardrollen neuen Objekten zuweisen :
ALTER DEFAULT PRIVILEGES IN SCHEMA public
GRANT SELECT ON TABLES TO xxx;
Beachten Sie, dass dies standardmäßig nur Objekte (Tabellen) betrifft, die von dem Benutzer erstellt wurden, der diesen Befehl ausgegeben hat. Er kann jedoch auch für jede Rolle festgelegt werden, in der der ausstellende Benutzer Mitglied ist. Sie erhalten jedoch nicht für alle Rollen, denen Sie angehören, Standardberechtigungen, wenn Sie neue Objekte erstellen. Es gibt also immer noch einige Probleme. Wenn Sie den Ansatz wählen, dass eine Datenbank eine Eigentümerrolle hat und Schemaänderungen als diese Eigentümerrolle ausgeführt werden, sollten Sie dieser Eigentümerrolle Standardberechtigungen zuweisen. IMHO ist das alles etwas verwirrend und Sie müssen möglicherweise experimentieren, um einen funktionierenden Workflow zu entwickeln.
Mehrere Tabellen / Ansichten (PostgreSQL-Versionen vor 9.0)
Um Fehler bei langwierigen Änderungen mit mehreren Tabellen zu vermeiden, wird empfohlen, den folgenden "automatischen" Prozess zu verwenden, um die GRANT SELECT
für jede Tabelle / Ansicht erforderlichen Daten zu generieren :
SELECT 'GRANT SELECT ON ' || relname || ' TO xxx;'
FROM pg_class JOIN pg_namespace ON pg_namespace.oid = pg_class.relnamespace
WHERE nspname = 'public' AND relkind IN ('r', 'v', 'S');
Dies sollte die relevanten GRANT-Befehle für alle Tabellen, Ansichten und Sequenzen in der Öffentlichkeit an GRANT SELECT ausgeben, um die Liebe zum Kopieren und Einfügen zu gewährleisten. Dies gilt natürlich nur für bereits erstellte Tabellen.
REVOKE CREATE ON SCHEMA public FROM PUBLIC;
. Ohne dies könnte der "schreibgeschützte" Benutzer vorhandene Tabellen nicht ändern, sondern neue Tabellen im Schema erstellen und Daten zu diesen Tabellen hinzufügen / daraus entfernen.psql mydb
anderen Methoden starten sollten, da dies sonst nicht der Fall wäre. Ich persönlich habe viel Zeit gebraucht, um es selbst herauszufinden. Hoffe das hilft jemandem.Beachten Sie, dass PostgreSQL 9.0 (heute im Beta-Test) eine einfache Möglichkeit bietet, dies zu tun :
quelle
Referenz aus diesem Blog:
Skript zum Erstellen eines schreibgeschützten Benutzers:
Weisen Sie diesem schreibgeschützten Benutzer die Berechtigung zu:
quelle
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO Read_Only_User;
Zukunft auch alle in derselben Datenbank erstellten Tabellen gelesen werden.INSERT
s benötigt .GRANT EXECUTE ON ALL FUNCTIONS IN SCHEMA schema_name TO Read_Only_User;
GRANT ALL ON ALL SEQUENCES IN SCHEMA schema_name TO Read_Only_User
?Hier ist der beste Weg, schreibgeschützte Benutzer hinzuzufügen (mit PostgreSQL 9.0 oder neuer):
Melden Sie sich dann bei allen zugehörigen Computern an (Master + Read-Slave (s) / Hot-Standby (s) usw.) und führen Sie Folgendes aus:
quelle
Standardmäßig haben neue Benutzer die Berechtigung, Tabellen zu erstellen. Wenn Sie vorhaben, einen schreibgeschützten Benutzer zu erstellen, ist dies wahrscheinlich nicht das, was Sie möchten.
Führen Sie die folgenden Schritte aus, um mit PostgreSQL 9.0+ einen echten schreibgeschützten Benutzer zu erstellen:
Wenn Ihr schreibgeschützter Benutzer keine Berechtigung zum Auflisten von Tabellen hat (dh
\d
keine Ergebnisse zurückgibt), liegt dies wahrscheinlich daran, dass Sie keineUSAGE
Berechtigungen für das Schema haben.USAGE
ist eine Berechtigung, mit der Benutzer die ihnen zugewiesenen Berechtigungen tatsächlich verwenden können. Was ist der Sinn davon? Ich bin mir nicht sicher. Reparieren:quelle
Ich habe dafür ein praktisches Skript erstellt. pg_grant_read_to_db.sh . Dieses Skript gewährt einer bestimmten Rolle schreibgeschützte Berechtigungen für alle Tabellen, Ansichten und Sequenzen in einem Datenbankschema und legt diese als Standard fest.
quelle
Ich habe alle möglichen Lösungen durchgelesen, die alle in Ordnung sind, wenn Sie daran denken, eine Verbindung zur Datenbank herzustellen, bevor Sie die Dinge gewähren;) Trotzdem danke an alle anderen Lösungen !!!
Erstellen Sie einen psql-Benutzer:
Starten Sie psql cli und legen Sie ein Passwort für den erstellten Benutzer fest:
Verbindung zur Zieldatenbank herstellen:
Gewähren Sie alle erforderlichen Berechtigungen:
Standardberechtigungen für Ziele ändern db public shema:
quelle
Wenn sich Ihre Datenbank im öffentlichen Schema befindet, ist dies einfach (dies setzt voraus, dass Sie das bereits erstellt haben
readonlyuser
).Wenn Ihre Datenbank verwendet wird
customschema
, führen Sie den obigen Vorgang aus, fügen Sie jedoch einen weiteren Befehl hinzu:quelle
Die nicht einfache Möglichkeit wäre, select für jede Tabelle der Datenbank zu gewähren:
Sie können dies automatisieren, indem Sie Ihre Grant-Anweisungen aus den Datenbank-Metadaten generieren.
quelle
quelle
Entnommen aus einem Link, der als Antwort auf den Link von despesz gepostet wurde .
Postgres 9.x scheint die Fähigkeit zu haben, das zu tun, was angefordert wird. Siehe den Abschnitt Grant On Database Objects von:
http://www.postgresql.org/docs/current/interactive/sql-grant.html
Wo es heißt: "Es gibt auch eine Option, Berechtigungen für alle Objekte desselben Typs innerhalb eines oder mehrerer Schemas zu erteilen. Diese Funktionalität wird derzeit nur für Tabellen, Sequenzen und Funktionen unterstützt (beachten Sie jedoch, dass ALLE TABELLEN Ansichten enthalten und fremde Tabellen). "
Auf dieser Seite wird auch die Verwendung von ROLLEN und eines PRIVILEGES mit dem Namen "ALLE PRIVILEGIEN" erläutert.
Ebenfalls vorhanden sind Informationen darüber, wie GRANT-Funktionen mit SQL-Standards verglichen werden.
quelle