我在一个具有相同功能名称的数据库中有两个类似的模式。 每个架构都由与架构名称匹配的角色拥有。
我有关于嵌套函数的函数名称解析的问题。 我期待外部函数会在同一模式中调用内部函数,但事实并非如此! 该名称是在运行时根据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
函数来获得这样的行为,但我正在寻找更直接的东西。