與條件約束比較的觸發程序

條件約束與 DML 觸發程序各有優點,使它們分別適合特殊的狀況。DML 觸發程序最主要的優點是,可在 Transact-SQL 程式碼中加入複雜的處理邏輯。因此,DML 觸發程序可支援所有的條件約束功能,但 DML 觸發程序在某些情況下,並非是最佳的方法。

實體完整性應由最低層級的索引強制執行,且應為 PRIMARY KEY 及 UNIQUE 條件約束的一部份,或是與條件約束完全無關。網域完整性應透過 CHECK 條件約束來強制執行,而參考完整性 (RI) 則應透過 FOREIGN KEY 條件約束來強制執行,這是假設其功能可滿足應用程式的功能需求而言。

當條件約束所支援的功能無法滿足應用程式的功能需求時,DML 觸發程序即可發揮它的作用。例如:

  • 除非 REFERENCES 子句定義串聯的參考動作,否則 FOREIGN KEY 條件約束只能透過與另一資料行中的值完全相符的值來驗證資料行值。

  • 條件約束只能傳達標準化的系統錯誤訊息。如果您的應用程式需要或有必要取得自訂訊息及更為詳盡的錯誤處理訊息,則您必須使用觸發程序。

DML 觸發程序可以串聯資料庫中相關資料表的變更,不過,透過串聯的參考完整性條件約束來執行這些變更會更有效率。

  • DML 觸發程序可不允許或可復原違反參考完整性的變更,因此會取消嘗試進行的資料修改。像這樣的觸發程序會在您變更外部索引鍵以及新值與其主索引鍵不相符時產生效果。然而,FOREIGN KEY 條件約束通常用於此目的。

  • 如果觸發資料表有條件約束的話,它們會在執行 INSTEAD OF 觸發程序後,但在執行 AFTER 觸發程序前檢查。如果違反條件約束的話,即復原 INSTEAD OF 觸發動作,並且不執行 AFTER 觸發程序。