ВИДАЛИТИ ВИБІР для всіх таблиць у postgresql


Відповіді:


144

Я подумав, що може бути корисним згадати, що станом на 9.0 у postgres є синтаксис для надання привілеїв для всіх таблиць (як і інших об'єктів) у схемі:

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

Ось посилання .


Я скоро оновлю, тож це дійсно хороша новина. Дякую!
Адам Матан

Чи впливає це на всі бази даних на сервері, які використовують загальнодоступну схему?
Крістіанп

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

Запуск від привілейованого користувача, він працював як шарм.


3
Якщо ви використовуєте pg_stat_user_tables замість all_tables, вам не потрібна ваша грап ... Крім того, передайте -A -t до psql, щоб позбутися від форматованого виводу.
Магнус Хагандр

1
Зауважте, що статтю Postgres 9.0 цей підхід відповідає на важкий шлях. У 9.x тепер "ВСІ" ми побачили в цій іншій відповіді .
Василь Бурк

ця не працює, коли назви таблиць або схем містять великі літери. Додавання модифікованої версії нижче
квітня

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 ..


2

Я закінчив це , і це спрацювало:

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

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
Англійською, будь ласка.
Затриматися

0

один із способів виправити це - написати збережену процедуру. на жаль, немає жодної команди "надати все для всіх таблиць". вам справді потрібна процедура або якийсь зовнішній скрипт оболонки, можливо, щоб зробити цю роботу.


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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.