首批通过分布式安全可靠测评,为关键业务系统打造
trigger 或 trigger 依赖的对象中显示调用 base_table%rowtype 可能导致 core
更新时间:2026-06-04 09:56
问题现象
trigger 或 trigger 依赖的对象中(如 package)显示调用 base_table%rowtype 可能会导致 core。
问题原因
base_table 是 trigger 的基表。因为 rowtype 的 id 是复用的 table_id,trigger 中传入的行(new/old)会有基表的 rowid 列,而 base_table%rowtype 不包含 rowid 列,导致 new/old 行比base_table%rowtype 多一列,在内核代码中拷贝的时候行数不一致导致 core。
关键诊断信息
触发条件
trigger 或 trigger 依赖的对象中(如 package)显示调用 base_table%rowtype。
问题的风险及影响
OBServer core。
影响租户
影响 OceanBase 数据库中的 Oracle 租户,对于 SYS 租户和 MySQL 租户无影响。
影响的版本
OceanBase 数据库 V2.2.77 GA(oceanbase-2.2.77-20210508211731)及之后版本、V3.1.2 GA(oceanbase-3.1.2-20210618150922)及之后版本、V3.2.3 GA(oceanbase-3.2.3.0-20220418212020)及之后版本。
解决方法
升级至问题已修复版本。目前已修复的版本包括 OceanBase 数据库 V2.2.77 BP18(oceanbase-2.2.77-118000012023052520)及之后版本、V3.1.2 BP11(oceanbase-3.1.2-111000052023010412)之后版本、V3.2.3 BP6 Hotfix2(oceanbase-3.2.3.3-106020042022120915)、V3.2.3 BP6 Hotfix3(oceanbase-3.2.3.3-106030012022121311)、V3.2.3 BP6 Hotfix4(oceanbase-3.2.3.3-106040022022122222)、V3.2.3 BP6 Hotfix5(oceanbase-3.2.3.3-106050012023051617)、V3.2.3 BP7(oceanbase-3.2.3.3-107000092023011911)及之后版本。
可以创建一个和 base_table 一模一样的表 base_table_copy,使用 base_table_copy%rowtype 代替 base_table%rowtype 使用。
规避方式
避免在 trigger 或 trigger 依赖的对象中显示调用 base_table%rowtype。