Любые хитрости, чтобы исправить эту синтаксическую ошибку в PLPG SQL? - PullRequest
1 голос
/ 30 марта 2020

Я создаю функцию для добавления ролей. Эта функция получает два аргумента: имя и список функций, которые могут быть выполнены из роли.

У меня проблемы с назначением содержимого аргумента 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 для выполнения этого действия?

1 Ответ

2 голосов
/ 30 марта 2020

Нельзя использовать переменные в качестве идентификаторов (имена столбцов или таблиц). Для этого вам нужны Dynami c SQL:

execute format('CREATE ROLE %I', v_role_name);

и

execute format('GRANT EXECUTE on FUNCTION %I to %I', i, v_role_name);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...