Как создать триггер события Postgres для назначения стандартных ролей на объекты - PullRequest
0 голосов
/ 05 февраля 2020

Я хочу убедиться, что все схемы / объекты в моем экземпляре Postgres (AWS / RDS) получают стандартную роль на основе соглашений об именах объектов и автоматически применяют стандартную роль после создания или обновления объекта.

Я начал с функции, созданной в схеме public, и триггера, который должен вызывать функцию для любого изменения DDL. Лог c функции должен предоставлять разрешения для схемы / объекта при его создании или обновлении, если имя начинается с rt_.

Пример функции:

DECLARE
    obj record;
BEGIN
FOR obj IN SELECT * FROM pg_event_trigger_ddl_commands()
LOOP
    RAISE NOTICE '% event object: %.% %',
                 tg_tag,
                 obj.object_type,
                 obj.schema_name,
                 obj.object_identity;
    INSERT INTO public.pg_event_trigger_ddl_commands_log(
        object_type, 
        shema_name, 
        object_identity, 
        tg_tag
    )
    VALUES (obj.object_type, obj.schema_name, obj.object_identity, tg_tag);

    IF obj.object_identity ~ '^rt_' THEN

        -- EXECUTE format('GRANT USAGE ON SCHEMA %I TO MY_ROLE;', obj.schema_name);

    END IF; 

END LOOP;
END;

Чтобы проверить вышеизложенное, я вижу, что условное IF obj.object_identity ~ '^rt_' THEN работает как положено, но EXECUTE format('GRANT USAGE ON SCHEMA %I TO MY_ROLE;', obj.schema_name); завершается ошибкой со следующей ошибкой:

ОШИБКА: роль "my_role" не существует

КОНТЕКСТ: SQL оператор "ИСПОЛЬЗОВАНИЕ ГРАНТА В СХЕМЕ rt_some_schema TO MY_ROLE;"

PL / pg SQL функция et_assign_schema_role_permissions () строка 21 в EXECUTE

Роль определенно существует в базе данных. Как я могу автоматически назначить роль?

1 Ответ

0 голосов
/ 29 февраля 2020

После более внимательного изучения ошибки я увидел значение my_role в нижнем регистре. Похоже, что это была проблема, когда Postgres требуются кавычки вокруг объекта, чтобы убедиться, что оболочка правильная.

EXECUTE format('GRANT USAGE ON SCHEMA %I TO "MY_ROLE";', obj.schema_name);
...