Назад | Перейти на главную страницу

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

Есть ли однострочный ВЫБРАТЬ разрешения к новый пользователь 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;

Вот ссылка.

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

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

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

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

  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. Это даст вам список запросов, которые будут генерировать необходимые разрешения. Скопируйте вывод, вставьте его в другой запрос и выполните.

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

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

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

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

Я считаю, что более естественным является форматирование и предложения where в sql ..

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