具有嵌套函数的PL / pgSQL函数名称解析

时间:2015-05-01 15:01:54

标签: postgresql scope plpgsql nested-function search-path

我在一个具有相同功能名称的数据库中有两个类似的模式。 每个架构都由与架构名称匹配的角色拥有。

我有关于嵌套函数的函数名称解析的问题。 我期待外部函数会在同一模式中调用内部函数,但事实并非如此! 该名称是在运行时根据search_path动态解析的,这会产生一些感觉,但不是我想要的。

这是一个测试用例。例如,假设模式和角色被命名为test和prod,如下所示。

测试架构:
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;
产品架构:
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;
测试用例:
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动态解析函数名称。有没有办法在模式范围内绑定内部函数?

我可以通过动态SQL和SECURITY DEFINER使用CURRENT_USER函数来获得这样的行为,但我正在寻找更直接的东西。

0 个答案:

没有答案