Frage GRANT SELECT zu allen Tabellen in Postgresql


Gibt es einen Einzeiler, der den Berechtigungen auswählen zu einem neuer Benutzer PostgreSQL?

Etwas, das den folgenden Pseudocode implementieren würde:

GRANT SELECT ON TABLE * TO my_new_user;

77
2017-08-30 14:11


Ursprung




Antworten:


Ich denke, es könnte hilfreich sein zu erwähnen, dass Postgrees ab Version 9.0 die Syntax hat, um Privilegien für alle Tabellen (sowie andere Objekte) in einem Schema zu gewähren:

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

Hier ist der Link.


131
2018-06-26 14:00



Ich werde bald upgraden, das sind wirklich gute Neuigkeiten. Vielen Dank! - Adam Matan
Betrifft dies alle Datenbanken auf dem Server, die das öffentliche Schema verwenden? - kristianp
Wenn ich eine neue Tabelle erstelle, hat dieser Benutzer Zugriff auf die neu erstellte Tabelle? - GuiSim
@GuiSim Nein, Sie müssen das einstellen default privileges in einem Schema, 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 betrifft alle Tabellen (Funktionen) im Schema public Für die aktuelle DB, mit der Sie verbunden sind. - SkyRaT


Meine (nicht einzinnige) 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.


11
2018-06-01 06:29



Wenn Sie pg_stat_user_tables anstelle von all_tables verwenden, brauchen Sie Ihr grep nicht ... Außerdem übergeben Sie -a -t an psql, um die formatierte Ausgabe loszuwerden. - Magnus Hagander
Beachten Sie, dass ab Postgres 9.0 der Ansatz dieser Antwort auf die harte Tour geht. In 9.x haben wir jetzt das "ON ALL" gesehen diese andere Antwort. - Basil Bourque


Dies kann in einem zweistufigen Prozess 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 = Schemas, denen Sie Berechtigungen erteilen möchten (kann nur "public" sein)

  2. Dadurch erhalten Sie eine Liste mit Abfragen, die die erforderlichen Berechtigungen generieren. Kopieren Sie die Ausgabe, fügen Sie sie in eine andere Abfrage ein und führen Sie sie aus.


8
2017-08-05 13:25





Das habe ich benutzt:

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

Ich denke, es ist natürlicher, Formatierungen und Where-Klauseln in SQL zu tun ..


2
2017-11-30 00:38





Ich arbeite mit Postgres 8.4 und um einem Benutzer alle Privilegien zu geben, mache 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

1
2018-04-05 18:04



Auf Englisch bitte. - Linger


Eine Möglichkeit, dies zu beheben, besteht darin, eine gespeicherte Prozedur zu schreiben. Leider gibt es keinen Befehl "alles an alle Tabellen gewähren" oder so. Sie brauchen wirklich eine Prozedur oder ein externes Shell-Skript, um das zu erreichen.


0
2017-07-03 18:20





Ich habe es getan diese, und es hat funktioniert:

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

0