更新时间:2026-07-28 GMT+08:00
特性概述
功能定义
失效重编译是指在数据库中,当某个对象(如存储过程、触发器、视图、包等)失效后,进行的重新编译操作。它的目的是恢复失效对象的功能,确保这些对象能够正确执行。失效可能由多种原因引起,尤其是在数据库架构或依赖的对象发生变化后,比如表结构的修改、依赖对象的删除或更新等。
失效重编译主要涉及以下几个功能模块:
- 一次性入库:创建视图或存储过程,不满足编译检查要求,例如依赖的外部对象尚未创建,也能将被创建对象插入到数据库的系统表中。
- 级联失效:当被依赖的对象变更时,依赖对象会级联失效。例如变更表字段时,依赖当前表的对象obj1会被失效,同时,依赖对象obj1的对象obj2会被级联失效。
- 重编译:包括手动重编译、自动重编译和批量重编译。
- 手动重编译:
ALTER PACKAGE objname COMPILE; ALTER FUNCTION/PROCEDURE objname COMPILE; ALTER VIEW objname COMPILE;
- 手动重编译:
使用失效重编译功能,需要开启如下GUC参数:
- enable_force_create_obj=on,提供一次性入库功能;
- ddl_invalid_mode='invalid',提供函数、存储过程和包的级联失效功能,参数值设置为delete时表示级联删除。
- enable_view_invalidation=on,提供视图的级联失效功能,参数值设置为off时表示关闭视图的级联失效功能。
用户场景
场景一:用户第一次部署数据库。
场景二:用户业务变更。
场景三:数据库系统迁移。
规格约束
函数、存储过程和包的失效重编译存在以下约束:
- 兼容性:支持A兼容模式数据库。
- 功能约束:
- 只支持A风格的存储过程和函数定义;
- 支持对象范围包括package、function/procedure、type、table、view;
- 函数执行块只记录直接调用的依赖关系pkg.func(xxx),func(xxx);
- 不支持同义词、物化视图、临时表依赖关系记录;
- 不支持package内自定义类型与type自定义类型重名;
- 数据库存在失效的用户自定义函数时,将无法使用\df全量查询或查询单个失效函数,提示存在失效对象报错;支持\sf查询未失效函数,查询失效函数会报错;
- 视图依赖函数的场景,重建被依赖函数仅支持自动重建与函数相同Schema的视图,其他场景需要手动重建视图;
- PACKAGE和FUNCTION的执行块访问其他对象时,直接调用FUNCTION,直接调用PACKAGE内FUNCTION,直接访问PACKAGE变量记录依赖关系,其他场景不支持记录依赖关系;
- PACKAGE和FUNCTION变量的默认值、表达式右值访问其他对象时,直接调用FUNCTION,直接调用PACKAGE内FUNCTION,直接访问PACKAGE变量记录依赖关系,其他场景不支持记录依赖关系;
- 匿名块和函数参数的CAST类型转换使用失效PACKAGE的类型时,需要手动执行ALTER PACKAGE pkgname COMPILE刷新;
- 开启GUC参数forbid_package_spec_circular_dependency,PACKAGE包头依赖成环对象状态为失效。
视图失效重编译存在以下规格约束:
- 兼容性:支持所有兼容模式数据库。
- 功能规格:
- 创建视图指定分区,新增视图与分区之间依赖关系;创建视图使用自定义类型或CAST类型转换,新增视图与自定义类型或CAST类型转换之间依赖关系。
依赖关系类型请参见《参考》中“系统表和系统视图 > 系统表 > 其他系统表 > PG_DEPEND”章节。
- 视图和函数失效功能参数(enable_view_invalidation和ddl_invalid_mode)均打开的情况下,DROP CASCADE删除底层依赖对象,函数会被置为失效状态,视图会被级联删除。
- 在开启事务后恢复视图依赖对象情况下,不支持通过调用视图触发其自动重编译。
- 创建视图指定分区,新增视图与分区之间依赖关系;创建视图使用自定义类型或CAST类型转换,新增视图与自定义类型或CAST类型转换之间依赖关系。
- 功能约束:
- 备机不支持失效重编译。
- 不支持同义词发生DDL变更触发视图失效。
- 通过DBLINK访问远端同义词的视图,不受远端同义词变更影响。
- 临时视图及依赖本地临时表的视图不支持自动重编译,需手动重编译。
- 回收站中视图对象不支持失效重编译。
父主题: 失效重编译