更新时间:2025-05-29 GMT+08:00

失效重编译概述

失效重编译提供一次性入库、失效重编译和级联失效功能。

  • 一次性入库:新建存储过程、函数和PACKAGE使用未定义的对象。例如表、函数或类型不存在,可新建成功,打印告警。系统表pg_object对应的valid字段为false。
  • 失效重编译功能:当未定义的对象都存在时,运行失效重编译高级包pkg_util.gs_compile_schema或者alter compile功能时,把对象变为有效,然后正常执行存储过程、函数和PACKAGE。
  • 级联失效功能:当被依赖的对象被删除时,不再级联删除依赖对象,而是失效依赖对象,例如函数出入参依赖表,删除表时,函数失效,但函数未被级联删除。
  • 重新创建包头,不删除原有包体功能:当使用CREATE OR REPLACE PACKAGE覆盖原有包头定义时,已经存在的包体定义不会被删除,而是被失效。支持使用ALTER COMPILE功能,尝试将包体变为有效。

使用该功能,推荐开启如下GUC参数:

  • enable_force_create_obj=on,提供一次性入库功能。
  • ddl_invalid_mode='invalid',提供级联失效功能。
  • 集中式A兼容模式数据库支持。
  • 开启失效重编参数后,数据库存在用户自定义函数失效对象时,将无法使用\df全量查询或查询单个失效函数,提示存在失效对象报错。
  • 视图依赖函数的场景,重建被依赖函数仅支持自动重建与函数相同schema的视图,其他场景需要手动重建视图。
  • 不支持记录同义词的依赖关系,记录同义词指向的原始对象依赖关系。
  • 不支持记录临时表的依赖关系。
  • 不支持记录物化视图的依赖关系。
  • PACKAGE和FUNCTION的执行块访问其他对象时,直接调用FUNCTION,直接调用PACKAGE内FUNCTION,直接访问PACKAGE变量记录依赖关系,其他场景不支持记录依赖关系。
  • PACKAGE和FUNCTION变量的默认值、表达式右值,直接调用FUNCTION,直接调用PACKAGE内FUNCTION,直接访问PACKAGE变量记录依赖关系,其他场景不支持记录依赖关系。
  • 自治事务函数调用,触发依赖对象嵌套编译,依赖对象状态不更新,需要手动ALTER PACKAGE刷新。
  • 匿名块和函数参数的CAST类型转换使用失效PACKAGE的类型时,需要手动ALTER PACKAGE刷新。