ИСПОЛЬЗОВАНИЕ ГРАНТА на всех схемах в базе данных?

12

Я хочу, чтобы GRANT USAGEпользователь / роль для данной базы данных. База данных имеет много схем.

Я знаю, что есть ON ALL TABLES IN SCHEMA, но я хочу "все схемы". Я пытался GRANT USAGE .. ON DATABASE, но это явно не так (на самом деле не существует ).

Это для Postgres 9.3 или 9.4, это сервер AWS RDS.

tedder42
источник

Ответы:

17

У вас есть как минимум два варианта.

Первый использует небольшой запрос и текстовый редактор. Мы должны собрать схемы нашего интереса:

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схеме. Проверьте другие объекты там - они хранят каждый аспект ваших схем, таблиц и так далее.
Dezso
источник
1
Интересно, можно ли имитировать привилегии по умолчанию для вновь создаваемых схем с помощью триггера событий, который автоматически запускает grant usageновую схему?
a_horse_with_no_name
@a_horse_with_no_name думая об этом, в настоящее время я не вижу причин, почему это не могло быть сделано.
Дезсо
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$;
Матеус Падуя
источник