Sql-Server

觸發器和事務

  • March 28, 2017

我們最近進行了更改,以根據以前在儲存過程中使用的邏輯創建約束,其中一部分包括使用INSTEAD OF觸發器來集中邏輯。

邏輯通常很簡單:

  1. 儲存過程包含針對視圖的 INSERT(或 UPDATE)語句,該視圖具有 INSTEAD OF INSERT/UPDATE 觸發器
  2. 觸發器包含實際邏輯——通常是兩條語句,處理將記錄插入/更新到主表和一個(或多個)支持表(包括引用完整性)。

問題是當觸發器中的語句中遇到類似 CHECK 約束的情況時。事務被轉儲,一切都被回滾。我正在考慮必須在有問題的儲存過程中複製 CHECK/etc 約束以在觸發器執行之前進行驗證——還有其他選擇嗎?

可能不是。違反聲明性約束總是會引發錯誤並阻止事務送出違反約束的寫入。數據庫約束的要點——檢查、外鍵、唯一性等——是它們通過中止違反約束的寫入來防止無效數據被記錄在數據庫中。違反約束會引發錯誤並回滾事務。

如果您希望事務優雅地失敗,您將不得不處理異常或在嘗試寫入數據之前預先驗證數據。在後一種情況下,您將不得不替換儲存過程中的驗證或在應用程序中實現驗證。

引用自:https://dba.stackexchange.com/questions/14962