2012-06-15 87 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;

相關問題