適用於:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Microsoft Fabric 中的 SQL 資料庫
DML 觸發程式是一種特殊的預存程式類型,會在數據作語言 (DML) 事件發生時自動生效,而該事件會影響觸發程式中定義的數據表或檢視表。 DML 事件包括 INSERT、 UPDATE或 DELETE 語句。 DML 觸發程序可用以強制執行商務規則和資料完整性、查詢其他資料表,以及包括複雜的 Transact-SQL 陳述式。 觸發程序和引發它的陳述式會被視為單一交易處理,而這樣的交易可以從觸發程序內部回復。 如果偵測到伺服器錯誤 (例如,磁碟空間不足),整個交易就會自動回復。
優點
DML 觸發程序與條件約束類似,兩者都可強制執行實體完整性或網域完整性。 一般而言,實體完整性應該一律由屬於PRIMARY KEY 和 UNIQUE 條件約束的索引在最低層級強制執行,或建立獨立於條件約束的索引。 網域完整性應透過 CHECK 條件約束強制執行,而引用完整性 (RI) 應透過 FOREIGN KEY 條件約束強制執行。 當條件約束所支援的功能無法符合應用程式的功能需求時,DML 觸發程式最有用。
下列清單會比較 DML 觸發程序與條件約束,以及識別 DML 觸發程序何時比條件約束更有利。
DML 觸發程序可以串聯資料庫中相關資料表的變更,不過,使用串聯的參考完整性條件約束來執行這些變更會更有效率。
FOREIGN KEY約束條件只能驗證與另一列中的值完全相符的欄位值,除非REFERENCES子句定義級聯參考動作。它們可以防範惡意或不正確的
INSERT、UPDATE和DELETE作業,並強制執行比使用CHECK條件約束所定義的限制更為複雜的其他限制。不同於
CHECK條件約束,DML 觸發程式可以參考其他數據表中的數據行。 例如,觸發程式可以使用SELECT另一個數據表中的 來比較插入或更新的數據,以及執行其他動作,例如修改數據或顯示使用者定義的錯誤訊息。它們可以評估資料修改前後的資料表狀態,並依據這些差異採取動作。
數據表上具有相同類型 (
INSERT、UPDATE或DELETE) 的多個 DML 觸發程式允許對相同修改語句執行多個不同的動作。條件約束只能傳達標準化的系統錯誤訊息。 如果您的應用程式需要或有必要取得自訂訊息及更為詳盡的錯誤處理訊息,則您必須使用觸發程序。
DML 觸發程式可以不允許或回復違反引用完整性的變更,從而取消嘗試的數據修改。 當您變更外鍵,且新值不符合其主鍵時,這類觸發程式可能會生效。 不過,
FOREIGN KEY條件約束通常用於此用途。如果在觸發程式數據表上存在條件約束,則會在執行
INSTEAD OF觸發程式之後但在AFTER觸發程式執行之前檢查它們。 如果違反條件約束,INSTEAD OF觸發程式動作會被回溯,而AFTER觸發程式則不會執行。
DML 觸發程式的類型
AFTER 觸發程序
AFTER 觸發程式會在執行 INSERT、UPDATE、MERGE 或 DELETE 語句後執行。
AFTER 如果發生條件約束違規,永遠不會執行觸發程式。 因此,這些觸發程式無法用於任何可能防止條件約束違規的處理。 對於每個語句中指定的INSERT,其對應的UPDATE、DELETE或MERGE動作將針對每個 DML 作業觸發相應的觸發程式。
INSTEAD OF 觸發程序。
INSTEAD OF 觸發器會覆蓋觸發語句的標準動作。 因此,它們可用來對一或多個數據行執行錯誤或值檢查,並在插入、更新或刪除數據列之前執行其他動作。 例如,更新薪資資料表中的時薪值時,可以定義一個觸發程序,讓它在超過指定的值時產生錯誤訊息並回復交易,或是先在薪資資料表中插入記錄,然後將新的記錄插入稽核記錄。 觸發程式的主要優點 INSTEAD OF 是,它們能使原本無法更新的檢視支援更新。 例如,以多個基表為基礎的檢視必須使用 INSTEAD OF 觸發程式來支援在多個數據表中參考數據的插入、更新和刪除。 觸發程式的另一個優點 INSTEAD OF 是,它允許您撰寫可拒絕批次中某些部分的程式邏輯,同時讓其他部分可以成功。
下表比較 AFTER 和 INSTEAD OF 觸發器的功能。
| 函式 |
AFTER 觸發器 |
INSTEAD OF 觸發器 |
|---|---|---|
| 適用性 | Tables | 資料表與檢視 |
| 每個資料表或檢視的數量 | 每個觸發動作可有多個(UPDATE、DELETE和INSERT) |
每個觸發動作一個 (UPDATE、 DELETE和 INSERT) |
| 串聯參考 | 沒有限制 |
INSTEAD OF UPDATE 和 DELETE 觸發程式不允許在作為連鎖參照完整性約束目標的資料表上使用。 |
| 執行 | 之後: 條件約束處理 宣告性參考動作 inserted 和 deleted 表格的創建觸發動作 |
之前:條件約束處理 取代:觸發動作 在建立 inserted 和 deleted 數據表之後 |
| 執行順序 | 可以指定第一個和最後一個執行 | 不適用 |
在 和 數據表中的 varchar(max)、inserted和 deleted 欄位引用 |
允許 | 允許 |
在 和 表格中的 text、inserted 和 deleted 列引用 |
不允許 | 允許 |
CLR 觸發程式
Common Language Runtime (CLR) 觸發器可以是 AFTER 或 INSTEAD OF 觸發器。 CLR 觸發程式也可以是資料定義語言 (DDL) 觸發程式。 CLR 觸發程序不執行 Transact-SQL 預存程序,而是執行以 Managed 程式碼撰寫的一個或多個方法,這些方法是在 .NET Framework 中建立並在 SQL Server 中上傳的組件成員。
相關工作
| Task | 文章 |
|---|---|
| 描述如何建立 DML 觸發程序。 | 建立 DML 觸發程式 |
| 描述如何建立 CLR 觸發程序。 | 建立 CLR 觸發程式 |
| 描述如何建立 DML 觸發程序以處理單一資料列和多資料列資料修改。 | 建立 DML 觸發程序以處理多重資料列 |
| 描述如何巢狀化觸發程序。 | 建立巢狀觸發程序 |
描述如何指定觸發器的觸發順序 AFTER。 |
指定第一個與最後一個觸發程序 |
| 描述如何在觸發程序程式碼中使用特殊插入和刪除資料表。 | 使用插入和已刪除的數據表 |
| 描述如何修改或重新命名 DML 觸發程序。 | 修改或重新命名 DML 觸發程序 |
| 描述如何檢視有關 DML 觸發程序的資訊。 | 取得關於 DML 觸發程序的詳細資訊 |
| 描述如何刪除或停用 DML 觸發程序。 | 刪除或停用 DML 觸發程序 |
| 描述如何管理觸發程序安全性。 | 管理觸發程式安全性 |