Вопрос: GRANT SELECT для всех таблиц в postgresql


Существует ли один вкладыш, который предоставляет Разрешения SELECT к новый пользователь PostGreSQL?

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

GRANT SELECT ON TABLE * TO my_new_user;

70
2017-08-30 14:11


Источник




Ответы:


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

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

Вот связь,


120
2018-06-26 14:00



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


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

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

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


11
2018-06-01 06:29



Если вы используете pg_stat_user_tables вместо all_tables, вам не нужен ваш grep ... Кроме того, передайте -A -t в psql, чтобы избавиться от форматированного вывода. - Magnus Hagander
Обратите внимание: с точки зрения Postgres 9.0 подход этого ответа делает это трудным путем. В 9.x у нас теперь есть «ON ALL», этот другой ответ, - Basil Bourque


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

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


7
2017-08-05 13:25





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

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

Я считаю, что более естественно делать форматирование и where-clauses в sql ..


2
2017-11-30 00:38





Я работаю с 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
2018-04-05 18:04



На английском пожалуйста. - Linger


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


0
2017-07-03 18:20





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

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

0