gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 12:01:52 25 4
gpt4 key购买 nike

正在关注 this answer我了解到我可以通过设置 check_function_bodies=false 来禁用 SQL 函数的语法检查。

在我的例子中:使用 Flyway where 运行升级

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

我的问题是——一旦所有其他依赖项都就位,是否可以对这样一个函数发出“重新检查”而不必实际调用它?类似于 Oracle 的 alter function ... compile

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

我想避免:

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

我尝试过的事情:

  • 做一个虚拟的改变函数
  • 调用pg_get_functiondef

最佳答案

我可以想到两种方法:

  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)

    对于 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
  2. 您可以重新定义函数并检查它是否抛出错误:

    SET check_function_bodies = on;
    DO $$BEGIN
    EXECUTE pg_get_functiondef('bad()'::regprocedure);
    END;$$;

关于postgresql - 如何重新检查使用 check_function_bodies=false 创建的 SQL 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54422768/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com