2012-06-15 108 views
4

我有一个庞大的pl/sql存储过程,只要插入就做一些删除操作。 程序用语句oracle - 违反完整性约束 - 找到子记录

EXECUTE IMMEDIATE 'SET CONSTRAINTS ALL DEFERRED' 

开始,并在最后commit声明我收到ORA-02292:诚信约束AAA侵犯。 问题是我不知道哪个语句确实导致它,因为我有两个从父表中删除(在子节点之前)并插入父表之前的子表。 我试图谷歌它,但到处都说,02292发生时,我只尝试删除。

当我尝试在子表中插入值时,会发生此错误,但父项中没有此项?

此外,02292和02291之间有什么区别?

+0

你有循环依赖吗?如果答案是否定的,只需按照正确的顺序插入即可。如果你这样做,为什么不是一直推迟的约束?在程序开始时执行此操作将表明您的模式/数据模型存在问题。 – Ben

+0

是的,我知道这个数据模型存在很大的问题(当然是由其他人编写的),但之前就可以,现在开始失败。所以我需要找出导致它的原因。是因为删除或特别是插入? – javagirl

回答

11

ORA-02292表示发生错误,因为A)约束没有指定ON DELETE子句,并且B)从子表中删除了具有匹配引用的主表中的一行。你的选择是修改约束,所以有一个ON DELETE CASCADE,或者确保所有的子记录都在删除之前被删除。我的首选是添加ON DELETE CASCADE,但我想可能有理由不这样做。请参阅ORA-02292

ORA-02291与此相反。如果您尝试向子表中插入一行,但在约束中指定的新子行上的键字段值不存在于主表中,则会引发ORA-02291。见ORA-02291

1

如果您想禁用名称中的约束来解决ORA-02292。

  1. 查找表名限定于约束

    SELECT owner, table_name FROM dba_constraints WHERE constraint_name = '{CONSTRAINT_NAME}';

  2. 禁用约束(该命令应该由一个管理员用户来执行)

    ALTER TABLE {TABLE_NAME} DISABLE constraint {CONSTRAINT_NAME} cascade;

相关问题