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 .


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.


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.


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 ..


2

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

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

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

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.


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.