2013-09-25 54 views
0

假設我有一個存儲過程在數據庫中插入一行到表中。如果我嘗試插入違反表中主鍵約束的行,數據庫顯然會拋出異常。現在,我是否應該在數據庫級別處理這個異常,還是可以將異常發送給客戶端並在那裏處理呢?哪一個是首選和更好的做法?我應該在數據庫端還是客戶端捕獲異常?

+0

Duplicate:http://stackoverflow.com/questions/464042/should-you-enforce-constraints-at-the-database-level-as-well-as-the-application – rags

回答

1

雖然我同意由衣衫襤褸的問題確實涵蓋了在數據庫中存在約束背後的原因,但我不認爲它完全回答了您的具體問題,因爲它不包括如何處理生成的異常來自數據庫。

所以,我認爲答案是「這取決於」。

如果您接受來自客戶端的輸入並嘗試使用此SP插入它,但SP內沒有生成任何其他數據,那麼是的,您應該向客戶端拋出某種異常,因爲您的SP無法處理此事件異常和不良數據來自客戶端。

不會捕獲您無法處理的異常。

在另一方面,如果SP本來是問題的原因 - 讓我們說,它會產生一些形成INSERT的部分數據,這是這個數據造成的問題,你實際上可以從中恢復 - 然後抓住它,恢復,客戶端不需要知道任何事情;如果您無法恢復,那麼通過一切手段,您可以在此處拋出異常(或者一些更廣義的異常,在記錄原始之後)回到客戶端,因爲您無法做更多的事情。

順便說一句,在對象驗證中擁有數據庫模式中存在的相同約束的「軟」版本沒有什麼問題 - 因爲模式中的任何更改都需要對映射對象進行更改,這很有意義(無論如何)將您在數據庫中定義的關係和結構約束視爲映射對象模型必須遵守的契約。

相關問題