故障现象:。在更新用户资产表的主键的时候,数据库存储过程抛出错误:
ORA-02292: 违反完整约束条件(OSS01.CNST_USER_MAIL_BINDING_FK) - 已找到子记录
故障分析:表的普通列更新在关系型数据库是正常现象,只会有两种结果:a、更新成功,b、更新不到记录。而表主键更新是关系型数据库的大忌,会产生很多问题。Oracle是明文不推荐这种操作的,如果应用确实有这方面的需求,需要关注如下几点:
1、 确认更新表是否被其他表进行外键关联。主从表结构,如果只更新主表,会报ORA-02292错误。正确的做法是,先更新从表,再更新主表。
2、 确认更新表的主键是否是表分区的值。如果使用了表的主键来进行分区,会报错误: ORA-14402: 更新分区关键字列将导致分区的更改。需要打开表的行迁移,使用命令:
Alter table XXX enable row movement;
注意:该语句会造成引用表XXX的对象(如存储过程、包、视图等)变为无效。执行完成后,最好执行一下utlrp.sql来编译无效的对象。
3、确认更新表是否会产生主键冲突的错误,代码要对更新语句进行索引冲突的错误捕捉。
修改方案:规避上面提到的三点问题。