Sql-Server
觸發器和事務
我們最近進行了更改,以根據以前在儲存過程中使用的邏輯創建約束,其中一部分包括使用
INSTEAD OF
觸發器來集中邏輯。邏輯通常很簡單:
- 儲存過程包含針對視圖的 INSERT(或 UPDATE)語句,該視圖具有 INSTEAD OF INSERT/UPDATE 觸發器
- 觸發器包含實際邏輯——通常是兩條語句,處理將記錄插入/更新到主表和一個(或多個)支持表(包括引用完整性)。
問題是當觸發器中的語句中遇到類似 CHECK 約束的情況時。事務被轉儲,一切都被回滾。我正在考慮必須在有問題的儲存過程中複製 CHECK/etc 約束以在觸發器執行之前進行驗證——還有其他選擇嗎?
可能不是。違反聲明性約束總是會引發錯誤並阻止事務送出違反約束的寫入。數據庫約束的要點——檢查、外鍵、唯一性等——是它們通過中止違反約束的寫入來防止無效數據被記錄在數據庫中。違反約束會引發錯誤並回滾事務。
如果您希望事務優雅地失敗,您將不得不處理異常或在嘗試寫入數據之前預先驗證數據。在後一種情況下,您將不得不替換儲存過程中的驗證或在應用程序中實現驗證。