it-swarm-ru.tech

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

Существует ли однострочник, который предоставляет ВЫБРАТЬ разрешенияновому пользователю postgresql?

Что-то, что могло бы реализовать следующий псевдокод:

GRANT SELECT ON TABLE * TO my_new_user;
94
Adam Matan

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

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

Вот ссылка .

153
TimH

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

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

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

12
Adam Matan

Это можно сделать с помощью двухэтапного процесса.

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

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

    Замены:

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

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

9
Ben Williams

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

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

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

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

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

2
stox

Я работаю с 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
wilson

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

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

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

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

0
postgresql007