Czy istnieje jedna wkładka, która przyznaje uprawnienia SELECT do nowego użytkownika PostgreSQL?
Coś, co implementuje następujący pseudo-kod:
GRANT SELECT ON TABLE * TO my_new_user;
Czy istnieje jedna wkładka, która przyznaje uprawnienia SELECT do nowego użytkownika PostgreSQL?
Coś, co implementuje następujący pseudo-kod:
GRANT SELECT ON TABLE * TO my_new_user;
Odpowiedzi:
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 .
default privileges
na schemacie, w którym utworzysz tabelę: postgresql.org/docs/current/static/…
public
dla bieżącej bazy danych, z którą jesteś połączony.
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.
Można to zrobić w dwuetapowym procesie.
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”)
To da ci listę zapytań, które wygenerują wymagane uprawnienia. Skopiuj dane wyjściowe, wklej je do innego zapytania i uruchom.
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
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.
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