ВИКОРИСТАННЯ ВИКОРИСТАННЯ на всіх схемах у базі даних?


13

Я хочу, щоб GRANT USAGEкористувач / роль для даної бази даних. У базі даних багато схем.

Я знаю, що є ON ALL TABLES IN SCHEMA, але я хочу "всі схеми". Я спробував GRANT USAGE .. ON DATABASE, але це, очевидно, неправильно (насправді це не існує ).

Це для Postgres 9.3 або 9.4, трапляється, що це сервер, який знаходиться на AWS RDS.

Відповіді:


18

У вас є як мінімум два варіанти.

Перший використовує невеликий запит та текстовий редактор. Ми маємо зібрати схеми, які нас цікавлять:

SELECT nspname
  FROM pg_namespace;

Ви можете додати WHEREпункт, якщо хочете обмежити область застосування. Скопіюйте висновок і змініть його, щоб ви отримали ряд GRANT USAGE ON SCHEMA ... TO your_role;команд. Потім просто подайте його psql, наприклад:

psql -f multigrant.sql

Звичайним варіантом цього може бути скрипт оболонки, який петлює над зібраними іменами та викликами psql, передаючи побудований GRANTоператор в -cпараметр.

Інше рішення в основному те саме робить в одному блоці pl / pgsql, будуючи динамічний запит. Ядро те саме - ми повинні збирати схеми. Тоді ми перев'язуємо всі вони, надаючи схему дозволів за схемою:

DO $do$
DECLARE
    sch text;
BEGIN
    FOR sch IN SELECT nspname FROM pg_namespace
    LOOP
        EXECUTE format($$ GRANT USAGE ON SCHEMA %I TO your_role $$, sch);
    END LOOP;
END;
$do$;

Примітки :

  • На відміну від таблиць, послідовностей, функцій та типів, не можна встановлювати пільги за замовчуванням для схем (станом на 9.4). Вам доведеться надати цю привілей для будь-якої щойно доданої схеми вручну.
  • тут я використовую котирування долара під час створення динамічного запиту. Це дозволяє мені використовувати "звичайний" синтаксис, на відміну від множення одиничних лапок, наприклад (немає в цьому прикладі). Таким чином більшість редакторів добре підкреслить твердження.
  • Я також використовую format()разом із %Iспецифікатором формату, щоб правильно вказати ім'я об'єкта. Цей підхід набагато читає, ніж побудова запиту з об'єднанням рядкових констант і деякими quote_ident()дзвінками.
  • pg_namespaceможна знайти на pg_catalogсхемі. Ознайомтесь з іншими об’єктами, які там знаходяться - вони зберігають усі аспекти ваших схем, таблиць тощо.

1
Цікаво, чи можна було б імітувати привілеї за замовчуванням для новостворених схем за допомогою тригера події, який автоматично запускає grant usageнову схему.
a_horse_with_no_name

@a_horse_with_no_name, думаючи про це, я не бачу в даний час жодної причини, чому це не вдалося зробити.
dezso

0

Ви також можете використовувати.

DO $do$
DECLARE
    sch text;
BEGIN
    FOR sch IN SELECT nspname FROM pg_namespace where nspname != 'pg_toast' 
    and nspname != 'pg_temp_1' and nspname != 'pg_toast_temp_1'
    and nspname != 'pg_statistic' and nspname != 'pg_catalog'
    and nspname != 'information_schema'
    LOOP
        EXECUTE format($$ GRANT USAGE ON SCHEMA %I TO your_role $$, sch);
        EXECUTE format($$ GRANT USAGE ON SCHEMA %I to your_role $$, sch);
        EXECUTE format($$ GRANT SELECT ON ALL SEQUENCES IN SCHEMA %I TO your_role $$, sch);
        EXECUTE format($$ GRANT SELECT ON ALL TABLES IN SCHEMA %I TO backup_user $$, sch);

        EXECUTE format($$ ALTER DEFAULT PRIVILEGES IN SCHEMA %I GRANT SELECT ON TABLES TO your_role $$, sch);
        EXECUTE format($$ ALTER DEFAULT PRIVILEGES IN SCHEMA %I GRANT SELECT ON SEQUENCES TO your_role $$, sch);
    END LOOP;
END;
$do$;
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.