Pyr*_*cks 4 postgresql syntax-checking plpgsql
根据这个答案,我了解到我可以通过设置禁用 SQL 函数的语法检查check_function_bodies=false。
就我而言:使用 Flyway 运行升级,其中
我的问题是 - 一旦所有其他依赖项都就位,是否可以对这样的函数进行“重新检查”而无需实际调用它?类似于 Oracle 的东西alter function ... compile。
理想情况下,我想check_function_bodies=false在升级开始时进行设置,然后在升级结束时重新检查每个 SQL 函数。
我想避免:
我尝试过的事情:
alter functionpg_get_functiondef我可以想到两种方法:
您可以直接调用语言验证器函数:
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)您可以重新定义该函数并检查它是否抛出错误:
SET check_function_bodies = on;
DO $$BEGIN
EXECUTE pg_get_functiondef('bad()'::regprocedure);
END;$$;
Run Code Online (Sandbox Code Playgroud)