ORA-02100 to ORA-04099
ORA-02298: 无法验证 (【SCHEMA名】.【约束名】) - 未找到父项关键字
ORA-02298: cannot validate (string.string) - parent keys not found
原因1: alter table操作时由于该表有孤立子记录导致验证约束失败。
an alter table validating constraint failed because the table has orphaned child records.
- 状态: 已验证。
分析: 创建外键约束时,约束列上子表比父表多记录,而外键约束的所造成的效果是约束列上的值如果不为空,则只能来自于父表的值:
-- 建两个表 create table ora_02298_1(a varchar2(30) primary key, b varchar2(30) unique); create table ora_02298_2(x varchar2(30), b varchar2(30)); -- 往第二个表插入一个数据 insert into ora_02298_2 values (1,1); commit; -- 第二个表b字段建外键约束,失败,报ORA-02298错误 alter table ora_02298_2 add constraints fk_ora_02298_2 foreign key(b) references ora_02298_1(b);
措施: 显而易见(只需比对整理子表父表间的数据即可)
Obvious
- 如果判断子表记录有效,则补充父表缺失记录。
如果判断子表记录无效,则删除子表无效记录。
-- 可采用类似下面的语句进行排查子表与父表的约束字段的值的差异情况 select * from ora_02298_2 t1 where not exists(select 1 from ora_02298_1 t2 where t1.b = t2.b) and t1.b is not null;
ORA-02437: 无法验证 (【SCHEMA名】.【主键名】) - 违反主键
ORA-02437: cannot validate (string.string) - primary key violated
原因1: 尝试使用重复值或空值验证主键。
attempted to validate a primary key with duplicate values or null values.
- 状态: 已验证。
分析: 创建主键约束时启用对已有数据的校验,或创建主键约束时禁用对已有数据的校验但约束对应的索引是唯一索引仍进行了校验。校验时表中约束列存在重复值或者空值(空值有疑虑,测试发现先校验空值报ORA-01449: 列包含 NULL 值; 无法将其变更为 NOT NULL),以致无法创建主键而报错,如下例所示:
-- 创建表与主键 create table ora_02437_1(a number, b varchar2(30)); -- 插入重复数据 insert into ora_02437_1(a,b) values(1,'1'); insert into ora_02437_1(a,b) values(1,'1'); -- 创建主键报错 alter table ora_02437_1 add constraints pk_ora_02437_1_a primary key(a) --(enable) (validate) -- 默认enable启用约束,且默认validate对已有数据进行校验 ; -- 创建主键限制不对已有数据进行校验,仍然报错 alter table ora_02437_1 add constraints pk_ora_02437_1_a primary key(a) enable novalidate ; -- 查看没有索引,但约束使用须有索引,而在创建唯一约束时系统默认给创建唯一索引,所以上条语句会报错 select t.status, t.* from user_indexes t where t.table_name = 'ORA_02437_1';
措施: 在启用主键之前,请删除重复项和空值。
remove the duplicates and null values before enabling a primary key.
- 如果需要对已有数据进行校验并添加主键,则需查询表并清除重复项和空值,而后再创建主键约束。
如果不需要对已有数据进行校验,则需先创建普通索引,再创建主键约束且加novalidate限制。
-- 先创建索引 create index pk_ora_02437_1_a on ora_02437_1(a) -- online --可同时加online参数保证创建索引的时候不阻塞DML操作,以免对运行中的系统造成影响 ; -- 再创建主键 alter table ora_02437_1 add constraints pk_ora_02437_1_a primary key(a) novalidate ; -- 清除重复项和空值后可再启动对已有数据校验 alter table ora_02437_1 modify constraint pk_ora_02437_1_a validate;
ORA-04098: 触发器 '【SCHEMA名】.【触发器名】' 无效且未通过重新验证
ORA-04098: trigger 'string.string' is invalid and failed re-validation
原因1: 检索执行到无效的触发器。它也表示该触发器编译/授权失败。
A trigger was attempted to be retrieved for execution and was found to be invalid. This also means that compilation/authorization failed for the trigger.
- 状态: 已验证。
- 措施: 解决编译/授权错误,禁用触发器或删除触发器。
Options are to resolve the compilation/authorization errors, disable the trigger, or drop the trigger.