更新时间:2026-07-28 GMT+08:00
分享

特性概述

功能定义

失效重编译是指在数据库中,当某个对象(如存储过程、触发器、视图、包等)失效后,进行的重新编译操作。它的目的是恢复失效对象的功能,确保这些对象能够正确执行。失效可能由多种原因引起,尤其是在数据库架构或依赖的对象发生变化后,比如表结构的修改、依赖对象的删除或更新等。

失效重编译主要涉及以下几个功能模块:
  • 一次性入库:创建视图或存储过程,不满足编译检查要求,例如依赖的外部对象尚未创建,也能将被创建对象插入到数据库的系统表中。
  • 级联失效:当被依赖的对象变更时,依赖对象会级联失效。例如变更表字段时,依赖当前表的对象obj1会被失效,同时,依赖对象obj1的对象obj2会被级联失效。
  • 重编译:包括手动重编译、自动重编译和批量重编译。
    • 手动重编译:
      ALTER PACKAGE objname COMPILE;
      ALTER FUNCTION/PROCEDURE objname COMPILE;
      ALTER VIEW objname COMPILE;
    • 自动重编译:

      GaussDB会自动尝试重编译失效的对象,例如当失效的视图、存储过程或函数被调用时,数据库会在执行时自动进行重编译。

    • 批量重编译:

      通过以下语句可查询数据库中的所有失效对象:

      SELECT * FROM pg_object WHERE valid='f';

      通过以下语句可调用接口对所有失效对象进行批量重编译:

      CALL PG_CATALOG.GS_COMPILE_SCHEMA(schema_name, false, 10);

使用失效重编译功能,需要开启如下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删除底层依赖对象,函数会被置为失效状态,视图会被级联删除。
    • 在开启事务后恢复视图依赖对象情况下,不支持通过调用视图触发其自动重编译。
  • 功能约束:
    • 备机不支持失效重编译。
    • 不支持同义词发生DDL变更触发视图失效。
    • 通过DBLINK访问远端同义词的视图,不受远端同义词变更影响。
    • 临时视图及依赖本地临时表的视图不支持自动重编译,需手动重编译。
    • 回收站中视图对象不支持失效重编译。

技术架构

失效重编译涉及模块:系统表、语法、PL/SQL引擎。

  • 系统表:
    • PG_OBJECT系统表记录对象有效性信息。
    • PG_DEPEND记录数据库对象间的依赖关系。
    • GS_DEP_SOURCE系统表记录对象原始定义信息和部分编译产物。
  • 语法:

    ALTER PACKAGE/FUNCTION/PROCEDURE/VIEW objname COMPILE语法、存储过程/视图创建语法、存储过程/视图访问语法。

  • PL/SQL引擎:

    存储过程编译模块和执行模块。

相关文档