GRANT SELECT für alle Tabellen in postgresql

Antworten:

144

Ich dachte, es wäre hilfreich zu erwähnen, dass postgres ab 9.0 die Syntax besitzt, um Berechtigungen für alle Tabellen (sowie für andere Objekte) in einem Schema zu erteilen:

GRANT SELECT ON ALL TABLES IN SCHEMA public TO user;
GRANT EXECUTE ON ALL FUNCTIONS IN SCHEMA public TO user;

Hier ist der Link .

TimH
quelle
Ich werde bald upgraden, das sind also wirklich gute Neuigkeiten. Vielen Dank!
Adam Matan
Betrifft dies alle Datenbanken auf dem Server, die das öffentliche Schema verwenden?
Kristianp
5
Wenn ich eine neue Tabelle erstelle, hat dieser Benutzer dann Zugriff auf die neu erstellte Tabelle?
GuiSim
8
@GuiSim Nein, Sie müssen das default privilegesin einem Schema festlegen, in dem Sie die Tabelle erstellen: postgresql.org/docs/current/static/…
SkyRaT
@kristianp Nein, jede Datenbank im PG-Cluster hat ein eigenes öffentliches Schema. Es wirkt sich auf alle Tabellen (Funktionen) im Schema publicfür den aktuellen DB aus, mit dem Sie verbunden sind.
SkyRaT
11

Meine (nicht einzeilige) Lösung:

#!/bin/bash

for table in `echo "SELECT schemaname || '.' || relname FROM pg_stat_user_tables;" | psql -A -t my_database_name`;
do
    echo "GRANT SELECT ON TABLE $table to my_new_user;"
    echo "GRANT SELECT ON TABLE $table to my_new_user;" | psql my_database_name
done

Vom privilegierten Benutzer ausgeführt, funktionierte es wie ein Zauber.

Adam Matan
quelle
3
Wenn Sie pg_stat_user_tables anstelle von all_tables verwenden, brauchen Sie kein grep ... Übergeben Sie -A -t an psql, um die formatierte Ausgabe zu entfernen.
Magnus Hagander
1
Beachten Sie, dass diese Antwort ab Postgres 9.0 auf die harte Tour geht. In 9.x haben wir jetzt das "ON ALL" in dieser anderen Antwort gesehen .
Basil Bourque
Dies funktioniert nicht, wenn Tabellen- oder Schemanamen Großbuchstaben enthalten. Hinzufügen einer modifizierten Version unten
26.
9

Dies kann in zwei Schritten erfolgen.

  1. Führen Sie diese Abfrage aus:

    select 'grant all on '||schemaname||'.'||tablename||' to $foo;'
    from pg_tables where schemaname in ('$bar', '$baz')
    order by schemaname, tablename;
    

    Ersatz:

    $foo= Benutzername, für den Sie Berechtigungen erteilen möchten
    $bar, $baz= Schema, für das Sie Berechtigungen erteilen möchten (kann nur "öffentlich" sein)

  2. Das wird Ihnen eine Liste von Abfragen geben, die die erforderlichen Berechtigungen generieren. Kopieren Sie die Ausgabe, fügen Sie sie in eine andere Abfrage ein und führen Sie sie aus.

Ben Williams
quelle
2

Das habe ich benutzt:

psql dbname -tc "select 'grant select on '||relname||' to readonly;' from pg_stat_user_tables" | psql dbname

Ich halte es für natürlicher, Formatierungen und Where-Klauseln in SQL durchzuführen.

stox
quelle
2

Ich am Ende tun dies , und es funktionierte:

ALTER DEFAULT PRIVILEGES IN SCHEMA public 
GRANT SELECT ON TABLES TO PUBLIC;
Szeitlin
quelle
1

Ich arbeite mit Postgres 8.4 und um einem Benutzer alle Rechte zu geben, mache ich folgendes:

#!/bin/bash

for table in `echo "SELECT schemaname||'.'||relname FROM pg_stat_all_tables WHERE schemaname NOT IN('pg_catalog','pg_toast','information_schema')" | psql -t db `;
do
    echo "grant select on table $table to my_new_user;"
    echo "grant select on table $table to my_new_user;" | psql db
done
Wilson
quelle
1
Auf Englisch bitte.
Verweilen Sie
0

Eine Möglichkeit, dies zu beheben, besteht darin, eine gespeicherte Prozedur zu schreiben. Unglücklicherweise gibt es keinen Befehl "Allen Tabellen alles gewähren" oder so. Sie brauchen wirklich eine Prozedur oder ein externes Shell-Skript, damit dies funktioniert.

postgresql007
quelle
0

Das (einzeilige) Skript von Adam Matan ist großartig, wenn es viele Schemas gibt, aber es funktioniert nicht, wenn Schemanamen oder Tabellennamen Großbuchstaben oder Sonderzeichen enthalten.

Geänderte Version:

#!/bin/bash

for table in `echo "SELECT '\"' || schemaname || '\".\"' || relname || '\"'  FROM pg_stat_user_tables;" | psql -A -t my_database_name`;
do
    echo "GRANT SELECT ON TABLE $table to my_new_user;"
    echo "GRANT SELECT ON TABLE $table to my_new_user;" | psql my_database_name
done
anneb
quelle