2012-02-25 37 views
1

我需要一個DB,我在工作的一些建議。約束雙重檢查

我有DB,現在我的工作過程,函數和觸發器(PL/SQL )。有三個實體,其中兩個從第三個實體繼承(按照概念數據模型),所以這意味着有兩個表引用第三個實體。我必須同時在「父」表和「子」表中插入數據,所以我想過在父表中插入一個過程,而另一個插入到子表中,可以調用前一個。

我的問題是,如果我試圖插入到父表中,然後再插入到子表中,並且由於某種原因我將數據插入到不滿足約束條件的子表中,會發生什麼?換句話說,儘管有這些限制,我還是還有必須驗證函數中的輸入數據嗎?你有什麼建議?

回答

2

這取決於。

假設子表和父表之間存在外鍵約束,如果您嘗試使用父表中不存在的鍵在子表中插入一行,則INSERT將引發異常該約束被違反。如果您僅希望INSERT操作因違反約束條件異常而失敗,則不需要檢查任何內容。

另一方面,您可能想要驗證代碼以便爲調用者提供更好的例外。例如,一個表有多個引用各種其他表的外鍵是比較常見的。檢查參數是否有效可能是有益的,這樣您可以更明確地告訴調用者哪個參數無效。

如果您要求如何確保插入到父表中並插入到子表中,或者兩者都失敗,那麼您正在討論如何建立正確的事務邊界。你會做這樣的事情

BEGIN 
    insert_into_parent(<<list of parameters>>); 
    insert_into_child( <<list of parameters>>); 
    commit; 
EXCEPTION 
    WHEN others 
    THEN 
    rollback; 
    RAISE; 
END; 

請注意,你的PL/SQL應用程序總是要明確地提交或回滾。那些交易控制報表應該處於最高水平。例如,您不希望在insert_into_parent過程中擁有事務控制語句,因爲如果您想要更廣泛的事務範圍,則永遠無法使用該過程。

+0

是的,有外鍵約束,但這不是重點,而是剩下的表約束。例如,假設我有這張表,並且它有一定的CHECK約束。如果我在第二個表中插入數據(在第一個表中成功插入數據之後),並由於某種原因拋出異常,因爲它違反了約束,數據將記錄在第一個表中,而不是第二個表中的數據。這就是我所擔心的。 – 2012-02-25 02:02:28

+2

@ user1231958 - 這是事務邊界的用途。如果插入到子表中失敗並且您不希望插入到父表中,除非兩個插入操作都成功,否則如果插入到子表中的過程拋出異常而不是拋出異常,則應用程序將簡單地發出回滾發出提交。 – 2012-02-25 02:19:06

+0

我是否必須發出回滾指令,還是自動執行?如果我在一個過程中的一個表中插入一個插入,然後從另一個過程調用它,如何?程序A - >調用程序B - >程序B插入並返回 - >程序A插入。另外還有 – 2012-02-25 02:26:10