GRANT SELECT для всех таблиц в postgresql

Ответы:

145

Я подумал, что было бы полезно упомянуть, что начиная с 9.0, postgres имеет синтаксис для предоставления привилегий всем таблицам (а также другим объектам) в схеме:

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

Вот ссылка .

TimH
источник
Я скоро обновлюсь, так что это действительно хорошие новости. Спасибо!
Адам Матан
Влияет ли это на все базы данных на сервере, которые используют общедоступную схему?
Кристианп
5
Если я создам новую таблицу, получит ли этот пользователь доступ к вновь созданной таблице?
GuiSim
8
@GuiSim Нет, вы должны установить в default privilegesсхеме, где вы создаете таблицу: postgresql.org/docs/current/static/…
SkyRaT
@kristianp Нет, каждая база данных в кластере PG имеет свою собственную общедоступную схему. Это влияет на все таблицы (функции) в схеме publicдля текущей БД, к которой вы подключены.
SkyRaT
11

Мое (не однострочное) решение:

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

Запуск от привилегированного пользователя, это работает как шарм.

Adam Matan
источник
3
Если вы используете pg_stat_user_tables вместо all_tables, вам не нужен ваш grep ... Также передайте -A -t в psql, чтобы избавиться от форматированного вывода.
Магнус Хагандер
1
Обратите внимание, что начиная с Postgres 9.0, подход с ответом делает это трудным путем. В 9.x теперь у нас есть «ON ALL», видимый в этом другом ответе .
Василий Бурк
этот не работает, когда имена таблиц или схем содержат заглавные буквы. Добавление модифицированной версии ниже
anneb
9

Это можно сделать в два этапа.

  1. Запустите этот запрос:

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

    Замены:

    $foo= имя пользователя, для которого вы хотите предоставить разрешения
    $bar, $baz= схемы, для которых вы хотите предоставить разрешения (может быть просто "общедоступным")

  2. Это даст вам список запросов, которые будут генерировать необходимые разрешения. Скопируйте вывод, вставьте его в другой запрос и выполните.

Бен Уильямс
источник
2

Это то, что я использовал:

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

Я чувствую, что это более естественно делать форматирование и где-предложения в SQL ..

Stox
источник
2

Я закончил тем, что делал это , и это работало:

ALTER DEFAULT PRIVILEGES IN SCHEMA public 
GRANT SELECT ON TABLES TO PUBLIC;
szeitlin
источник
1

Я работаю с 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
Вильсон
источник
1
По английски пожалуйста.
Linger
0

Один из способов исправить это - написать хранимую процедуру. к сожалению, не существует команды «предоставить все для всех таблиц» или около того. Вы действительно нуждаетесь в процедуре или некотором внешнем сценарии оболочки, возможно, чтобы заставить это работать.

postgresql007
источник
0

Сценарий (однострочное решение) Адама Матана великолепен, когда имеется много схем, но он не работает, когда имена схем или таблиц содержат заглавные буквы или специальные символы.

Модифицированная версия:

#!/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
источник