2013-10-14 86 views
1

我有一個表格,其中一個序列爲每個記錄添加了主ID,現在第3條記錄被刪除,我需要將其重新插入ID爲3,但由於序列存在,它不會讓我,誰能提醒?我嘗試插入時收到以下消息。插入條目並忽略序列

ORA-20001:表序號在內部提供; 「owner.trigger_name」,4號線

ORA-04088:請不要在插入SQL語句

ORA-06512在包括錯誤觸發的執行過程中 'owner.trigger_name'

回答

4

ORA-20001錯誤在用戶定義的範圍內,所以它是您自己的代碼(或者應用程序的代碼,無論如何)都在抱怨 - 它不是Oracle本身。

它看起來像分配ID的觸發器正在執行健全性檢查並在插入過程中發現該值已被手動提供時引發該異常。這大概是爲了保護你自己,並且它會阻止你輸入一個高於當前序列號的值 - 當序列達到相同的值時,這會導致錯誤。 (假設它是一個主鍵,或者至少有一個唯一的約束)。

由於它來自您自己的應用程序代碼,唯一的解決方法是識別並禁用從序列中分配ID值並引發異常的觸發器。

alter trigger <trigger_name> disable; 

...然後當你做:

alter trigger <trigger_name> enable; 

但我只是想在停電時做到這一點,或當你至少可以保證不會有其他刀片上這張桌子。禁用觸發器時的任何插入都不會獲得分配的ID。他們也應該錯誤 - 再次假設它是一個主鍵,或者一個非空的唯一鍵 - 但這仍然不可取。

如果您確實無法防止其他插入,您可以(暫時)重新創建觸發器,而無需執行完整性檢查,但即便如此,這也不是輕而易舉的事情。

當然,如果它是一個合成密鑰,那麼實際的密鑰值應該沒有關係,在這種情況下,它應該罰款做一個正常的插入併爲重新插入的行獲取一個新的ID值。如果其他表有一個3的引用,那麼它聽起來像你沒有外鍵約束,這將阻止該行被首先刪除。

+0

感謝您的理解,我會安排停機時間進行更改,再次感謝。 – llanato