我在具有相同函数名称的单个数据库中有两个相似的模式。每个模式都由与模式名称匹配的角色拥有。
我有关于嵌套函数的函数名称解析的问题。我原以为外部函数会在同一个模式中调用内部函数,但事实并非如此!该名称是在运行时根据 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
运行时动态解析的。有没有办法在模式范围内绑定内部功能?
SECURITY DEFINER
我可以通过使用具有动态 SQL 和的函数来获得这种行为CURRENT_USER
,但我正在寻找更直接的方法。