如何从函数内部了解父架构名称

  • 本文关键字:了解 函数 内部 postgresql
  • 更新时间 :
  • 英文 :


从函数内部,我需要知道该函数所属的架构。有什么办法知道在Postgresql中?

fyi,current_schema()函数为我提供了当前会话的集合架构,这不是我想要的。例如,我现在在架构test1中,可以调用函数test2.test_function()。现在,该功能current_schema()将提供test1。但是我需要获取test2,这是功能模式。

进行了一些研究并连接了几个答案,我想出了这个解决方案。

CREATE OR REPLACE FUNCTION parent_schema()
    RETURNS text AS  $$
    DECLARE
        stack text; fcesig text;
        function_oid oid;
        schema_name text;
    BEGIN
        GET DIAGNOSTICS stack = PG_CONTEXT;
        fcesig := substring(stack from 'function (.*?) line');
        function_oid := fcesig::regprocedure::oid;
        SELECT routine_schema INTO schema_name FROM information_schema.routines WHERE regexp_replace(specific_name, '^.+?([^_]+)$', '1')::int = function_oid;
        RETURN schema_name;
    END;
$$ LANGUAGE plpgsql;

帮助我形成了这个的答案:
https://stackoverflow.com/a/32016935/5645769
https://stackoverflow.com/a/1347639/5645769
https://stackoverflow.com/a/24034604/5645769

据我所知,以可靠的方式不可能。

您在答案中提供的功能不起作用:

CREATE FUNCTION public.myfunc() RETURNS text
   LANGUAGE sql
   AS 'SELECT laurenz.parent_schema()';
CREATE FUNCTION laurenz.myfunc() RETURNS text
   LANGUAGE sql
   AS 'SELECT laurenz.parent_schema()';

您的功能给出了错误的答案:

test=> SELECT public.myfunc();
 myfunc  
---------
 laurenz
(1 row)

最新更新