Есть один вкладыш , который выдает 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