Gibt es einen Einzeiler , der einem neuen Benutzer die SELECT-Berechtigungen für postgresql gewährt?
Etwas, das den folgenden Pseudocode implementieren würde:
GRANT SELECT ON TABLE * TO my_new_user;
Gibt es einen Einzeiler , der einem neuen Benutzer die SELECT-Berechtigungen für postgresql gewährt?
Etwas, das den folgenden Pseudocode implementieren würde:
GRANT SELECT ON TABLE * TO my_new_user;
Antworten:
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 .
default privileges
in einem Schema festlegen, in dem Sie die Tabelle erstellen: postgresql.org/docs/current/static/…
public
für den aktuellen DB aus, mit dem Sie verbunden sind.
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.
Dies kann in zwei Schritten erfolgen.
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)
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.
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
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.
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