如何重新检查使用 check_function_bodies=false 创建的 SQL 函数?

Pyr*_*cks 4 postgresql syntax-checking plpgsql

根据这个答案,我了解到我可以通过设置禁用 SQL 函数的语法检查check_function_bodies=false

就我而言:使用 Flyway 运行升级,其中

  1. 函数创建的顺序没有明确定义
  2. 某些功能使用同一升级中尚未创建的其他功能。

我的问题是 - 一旦所有其他依赖项都就位,是否可以对这样的函数进行“重新检查”而无需实际调用它?类似于 Oracle 的东西alter function ... compile

理想情况下,我想check_function_bodies=false在升级开始时进行设置,然后在升级结束时重新检查每个 SQL 函数。

我想避免:

  1. 控制脚本的运行顺序。
  2. 重新运行函数创建脚本

我尝试过的事情:

  • 做假人alter function
  • 呼唤pg_get_functiondef

Lau*_*lbe 6

我可以想到两种方法:

  1. 您可以直接调用语言验证器函数:

    SELECT lanname, lanvalidator::regprocedure FROM pg_language;
    
      lanname   |         lanvalidator         
    ------------+------------------------------
     internal   | fmgr_internal_validator(oid)
     c          | fmgr_c_validator(oid)
     sql        | fmgr_sql_validator(oid)
     plpgsql    | plpgsql_validator(oid)
     plpython3u | plpython3_validator(oid)
    (5 rows)
    
    Run Code Online (Sandbox Code Playgroud)

    对于 SQL 函数,其工作方式如下:

    SET check_function_bodies = off;
    CREATE FUNCTION bad() RETURNS void LANGUAGE sql AS 'SELECT $1';
    
    SET check_function_bodies = on;
    SELECT fmgr_sql_validator('bad()'::regprocedure);
    
    ERROR:  there is no parameter $1
    LINE 1: SELECT $1
                   ^
    QUERY:  SELECT $1
    
    Run Code Online (Sandbox Code Playgroud)
  2. 您可以重新定义该函数并检查它是否抛出错误:

    SET check_function_bodies = on;
    DO $$BEGIN
       EXECUTE pg_get_functiondef('bad()'::regprocedure);
    END;$$;
    
    Run Code Online (Sandbox Code Playgroud)