WYBIERZ GRANT do wszystkich tabel w postgresql

Odpowiedzi:

144

Pomyślałem, że warto wspomnieć, że od wersji 9.0 postgres ma składnię, która nadaje uprawnienia wszystkim tabelom (a także innym obiektom) w schemacie:

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

Oto link .

TimH
źródło
Niedługo dokonam aktualizacji, więc to naprawdę dobra wiadomość. Dzięki!
Adam Matan
Czy wpływa to na wszystkie bazy danych na serwerze, które korzystają ze schematu publicznego?
kristianp
5
Jeśli utworzę nową tabelę, czy ten użytkownik będzie miał dostęp do nowo utworzonej tabeli?
GuiSim,
8
@GuiSim Nie, musisz ustawić default privilegesna schemacie, w którym utworzysz tabelę: postgresql.org/docs/current/static/…
SkyRaT
@kristianp Nie, każda baza danych w klastrze PG ma swój własny schemat publiczny. Wpływa na wszystkie tabele (funkcje) w schemacie publicdla bieżącej bazy danych, z którą jesteś połączony.
SkyRaT
11

Moje rozwiązanie (inne niż liniowe):

#!/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

Uruchom z uprzywilejowanego użytkownika, działało jak urok.

Adam Matan
źródło
3
Jeśli użyjesz pg_stat_user_tables zamiast all_tables, nie potrzebujesz grep ... Przekaż także -A -t do psql, aby pozbyć się sformatowanego wyjścia.
Magnus Hagander
1
Pamiętaj, że od Postgres 9.0 podejście oparte na tej odpowiedzi jest trudne. W wersji 9.x mamy teraz „WSZYSTKO” widoczne w tej drugiej odpowiedzi .
Basil Bourque,
ten nie działa, gdy nazwy tabel lub schematów zawierają wielkie litery. Dodanie poniżej zmodyfikowanej wersji
anneb
9

Można to zrobić w dwuetapowym procesie.

  1. Uruchom to zapytanie:

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

    Części zamienne:

    $foo= nazwa użytkownika, dla którego chcesz przyznać uprawnienia
    $bar, $baz= schematy, w których chcesz przyznać uprawnienia (może być po prostu „publiczny”)

  2. To da ci listę zapytań, które wygenerują wymagane uprawnienia. Skopiuj dane wyjściowe, wklej je do innego zapytania i uruchom.

Ben Williams
źródło
2

Właśnie tego użyłem:

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

Wydaje mi się, że bardziej naturalne jest formatowanie i klauzule where w sql ..

stox
źródło
2

Skończyło się na tym i zadziałało:

ALTER DEFAULT PRIVILEGES IN SCHEMA public 
GRANT SELECT ON TABLES TO PUBLIC;
szeitlin
źródło
1

Pracuję z postgres 8.4 i aby nadać użytkownikowi wszystkie uprawnienia, wykonaj następujące czynności:

#!/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
źródło
1
Proszę po angielsku.
Linger
0

Jednym ze sposobów rozwiązania tego jest napisanie procedury składowanej. niestety nie ma polecenia „przyznaj wszystko wszystkim tabelom”. naprawdę potrzebujesz procedury lub jakiegoś zewnętrznego skryptu powłoki, żeby to zadziałało.

postgresql007
źródło
0

Skrypt (rozwiązanie jednowierszowe) Adama Matana jest świetny, gdy istnieje wiele schematów, ale nie działa, gdy nazwy schematów lub nazwy tabel zawierają wielkie litery lub znaki specjalne.

Zmodyfikowana wersja:

#!/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
źródło