【问题标题】:How to know the parent schema name from inside a function如何从函数内部知道父模式名称
【发布时间】:2017-11-29 05:16:49
【问题描述】:

从函数内部,我需要知道该函数属于哪个模式。有没有办法在 Postgresql 中知道这一点?

仅供参考,current_schema() 函数为我提供了当前会话的设置模式,这不是我想要的。例如,我现在在模式test1 中,我可以调用函数test2.test_function()。现在,从函数内部current_schema() 将给出test1。但我需要得到test2,这是函数模式。

【问题讨论】:

    标签: postgresql


    【解决方案1】:

    在做了一些研究并连接了几个 SO 答案后,我想出了这个解决方案。

    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

    【讨论】:

      【解决方案2】:

      据我所知,这是不可能的。

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

      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)
      

      【讨论】:

      • 谢谢,经过一番研究,找到了解决方法:stackoverflow.com/a/47546362/5645769
      • 我看到了,我不认为这是一个解决方案。您只能获取函数的名称,但无法确定它在哪个模式中以及参数是什么。请记住,可以有许多同名的函数(例如generate_series)。
      • 我只需要知道一个函数的父模式名称,所以这解决了我现在的问题。是的,可以有多个模式具有相同的函数名称,这就是我寻找这个的原因,所以这会告诉我,正在调用哪个特定函数(从哪个模式?)。但是如果你还需要知道参数,我想你也可以通过调用pg_get_function_arguments(func_oid) 来获取,因为我们已经得到了函数的 oid。
      • 我已经扩展了我的答案来解释我的意思。
      • 对不起,你理解我的操作错误。每当您调用 laurenz.parent_schema() 它应该返回 laurenz (这是功能父模式),这就是我想要的。所以这不是错误的答案,而是正确的答案。
      猜你喜欢
      • 2016-03-15
      • 2017-09-07
      • 1970-01-01
      • 1970-01-01
      • 2019-11-03
      • 1970-01-01
      • 1970-01-01
      • 2014-06-11
      • 2021-07-07
      相关资源
      最近更新 更多