Є один вкладиш , який видає SELECT , дозволу на новий призначений для користувача PostgreSQL?
Щось, що реалізує наступний псевдо-код:
GRANT SELECT ON TABLE * TO my_new_user;
Є один вкладиш , який видає SELECT , дозволу на новий призначений для користувача PostgreSQL?
Щось, що реалізує наступний псевдо-код:
GRANT SELECT ON TABLE * TO my_new_user;
Відповіді:
Я подумав, що може бути корисним згадати, що станом на 9.0 у postgres є синтаксис для надання привілеїв для всіх таблиць (як і інших об'єктів) у схемі:
GRANT SELECT ON ALL TABLES IN SCHEMA public TO user;
GRANT EXECUTE ON ALL FUNCTIONS IN SCHEMA public TO user;
Ось посилання .
default privileges
схему, де ви створюєте таблицю: postgresql.org/docs/current/static/…
public
для поточної БД, до якої ви підключені.
Моє рішення (не для одного вкладиша):
#!/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
Запуск від привілейованого користувача, він працював як шарм.
Це можна зробити двоступеневим процесом.
Запустіть цей запит:
select 'grant all on '||schemaname||'.'||tablename||' to $foo;'
from pg_tables where schemaname in ('$bar', '$baz')
order by schemaname, tablename;
Заміни:
$foo
= ім'я користувача, для якого ви хочете надати дозволи
$bar
, $baz
= схеми, для яких потрібно надати дозволи (можуть бути просто "загальнодоступними")
Це дасть вам список запитів, які генерують необхідні дозволи. Скопіюйте вихід, вставте його в інший запит та виконайте.
Я працюю з postgres 8.4 і щоб надати всім привілеям користувачеві, виконайте наступні дії:
#!/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
один із способів виправити це - написати збережену процедуру. на жаль, немає жодної команди "надати все для всіх таблиць". вам справді потрібна процедура або якийсь зовнішній скрипт оболонки, можливо, щоб зробити цю роботу.
Сценарій (однолінійне рішення) Адама Матана чудовий, коли є багато схем, але він не працює, коли назви схем або назви таблиць містять великі літери або спеціальні символи.
Модифікована версія:
#!/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