Я создаю функцию для добавления ролей. Эта функция получает два аргумента: имя и список функций, которые могут быть выполнены из роли.
У меня проблемы с назначением содержимого аргумента v_execute внутри оператора: GRANT EXECUTE on FUNCTION i to v_rolename;
Проблема в том, что EXECUTE для FUNCTION ожидает имя функции, подобное этому: fn_customer_add()
, и я передаю туда переменную типа массива.
Это мой код plpg sql:
create function fn_roles_add(v_role_name varchar, v_execute varchar[]) returns character varying
language plpgsql
as
$$
DECLARE
i varchar;
BEGIN
CREATE ROLE v_role_name;
/* Function execution permissions are assigned from the array argument v_role_name */
FOREACH i IN ARRAY v_execute
LOOP
GRANT EXECUTE on FUNCTION i to v_role_name;
END LOOP;
RETURN 'OK';
END;
$$;
Если я заменю v_execute[i]
на имя существующей функции, она будет работать правильно. Но мне нужно иметь возможность передавать ему переменное число функций, поскольку моя база данных основана на использовании функций почти для всех запросов.
Ошибка:
[42601] ОШИБКА: синтаксис ошибка в или около «к»
У кого-нибудь есть идеи обмануть plpg sql для выполнения этого действия?