У меня есть две похожие схемы в одной базе данных с одинаковыми именами функций. Каждая схема принадлежит роли, которая соответствует имени схемы.
У меня есть проблемы с разрешением имени функции с вложенными функциями. Я ожидал, что внешняя функция вызовет внутренние функции в той же схеме, но это не так! Имя разрешается динамически на основе search_path во время выполнения, что имеет некоторый смысл, но не так, как я.
Вот тестовый пример. Скажем, например, что схемы и роли называются test и prod, как показано ниже.
Test schema:CREATE ROLE test NOLOGIN;
CREATE SCHEMA test AUTHORIZATION test;
CREATE OR REPLACE FUNCTION test.inner_func() RETURNS TEXT
AS $BODY$
BEGIN
RETURN 'test function';
END
$BODY$ LANGUAGE 'plpgsql';
ALTER FUNCTION test.inner_func() OWNER TO test;
CREATE OR REPLACE FUNCTION test.outer_func() RETURNS SETOF TEXT
AS $BODY$
BEGIN
RETURN QUERY SELECT inner_func();
END
$BODY$ LANGUAGE 'plpgsql';
ALTER FUNCTION test.outer_func() OWNER TO test;
Prod schema:
CREATE ROLE prod NOLOGIN;
CREATE SCHEMA prod AUTHORIZATION prod;
CREATE OR REPLACE FUNCTION prod.inner_func() RETURNS TEXT
AS $BODY$
BEGIN
RETURN 'prod function';
END
$BODY$ LANGUAGE 'plpgsql';
ALTER FUNCTION prod.inner_func() OWNER TO prod;
CREATE OR REPLACE FUNCTION prod.outer_func() RETURNS SETOF TEXT
AS $BODY$
BEGIN
RETURN QUERY SELECT inner_func();
END
$BODY$ LANGUAGE 'plpgsql';
ALTER FUNCTION prod.outer_func() OWNER TO prod;
Test cases:
SET search_path=test,public;
SELECT outer_func();
> test function
SELECT prod.outer_func();
> test function <<<---- was expecting prod function
SET search_path=prod,public;
SELECT prod.outer_func();
> prod function
Тест показывает, что имена функций разрешаются динамически на основе search_path
во время выполнения. Есть ли способ связать внутреннюю функцию в рамках схемы?
Я могу добиться такого поведения, используя SECURITY DEFINER
функции с динамическим SQL и CURRENT_USER
, но я ищу что-то более простое.
SET
в определении функции). Кстати: название языка является идентификатором, не заключайте его в одинарные кавычки. Это устаревший синтаксис, который будет удален в будущем. - person a_horse_with_no_name   schedule 01.05.2015