Я хочу убедиться, что все схемы / объекты в моем экземпляре 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
Роль определенно существует в базе данных. Как я могу автоматически назначить роль?