1. 程式人生 > >觸發器以及事前觸發和事後觸發,語句級觸發和行級觸發

觸發器以及事前觸發和事後觸發,語句級觸發和行級觸發

一、觸發器概念

觸發器是一種特殊型別的儲存過程,它不同於之前的我們介紹的儲存過程。觸發器主要是通過事件(增、刪、改)進行觸發被自動呼叫執行的。而儲存過程可以通過儲存過程的名稱被呼叫。

觸發器是在對錶進行增、刪、改時,自動執行的儲存過程。觸發器常用於強制業務規則,它是一種高階約束,通過事件進行觸發而被執行。

二、觸發器分類

SQL Server 包括兩種常規型別的觸發器:資料操作語言 (DML) 觸發器資料定義語言 (DDL) 觸發器

當INSERT、UPDATE 或 DELETE 語句修改指定表或檢視中的資料時,可以使用 DML 觸發器。 DDL 觸發器激發儲存過程以響應各種 DDL 語句,這些語句主要以CREATE、ALTER 和 DROP 開頭。 DDL 觸發器可用於管理任務,例如稽核和控制資料庫操作。

通常說的觸發器就是DML觸發器。

1、DML觸發器分為:

(1) after觸發器(事後觸發)

    a、 insert觸發器
    b、 update觸發器
    c、 delete觸發器 

(2) instead of 觸發器 (事前觸發)

注:after觸發器要求只有執行某一操作**insert、update、delete之後觸發器才被觸發,且只能定義在表上。而**instead of觸發器表示並不執行其定義的操作(insert、update、delete)而僅是執行觸發器本身。既可以在表上定義instead of觸發器,也可以在檢視上定義。

2、DDL 觸發器使用場合:

(1)要防止對資料庫架構進行某些更改。

(2)希望資料庫中發生某種情況以響應資料庫架構中的更改。

(3)要記錄資料庫架構中的更改或事件。

三、使用觸發器的時機

1、實現主外來鍵關係所不能保證的複雜參照完整性資料的一致性
不過,通過“級聯引用完整性約束”可以更有效地執行這些更改。

2、防止惡意或錯誤的 INSERT、UPDATE 以及 DELETE 操作,並強制執行比 CHECK 約束定義的限制更為複雜的其他限制。
與 CHECK 約束不同(check約束只能引用自身表中的列),DML觸發器可以引用其他表中的列;
觸發器可以完成所有約束的功能,但不一定是最佳方案;
觸發器能夠使用自定義資訊和較為複雜的錯誤處理;

3、DML 觸發器可以評估資料修改前後表的狀態

,並根據該差異采取措施。

4、一個表中的同一個修改語句的DML觸發器允許被多個不同的操作(INSERT、UPDATE 或 DELETE)來響應;

四、例項

觸發器分為事前觸發和事後觸發,這兩種觸發有何區別?語句級觸發和行級觸發有何區別?

答:事前觸發器運行於觸發事件發生之前,而事後觸發器運行於觸發事件發生之後。通常事前觸發器可以獲取事件之前和新的欄位值。
語句級觸發器可以在語句執行前或後執行,而行級觸發在觸發器所影響的每一行觸發一次。

分析:簡單而言,事前觸發主要是驗證一些條件或進行一些準備工作,在表儲存之前就觸發,而事後觸發則是進行收尾工作,保證事務的完整性,在表經過修改以後才觸發。行級觸發器是對DML語句影響的每個行執行一次,如UPDATE語句影響多行,就會對每行都啟用一次觸發器。而語句級觸發器是對每個DML語句執行一次,如INSERT語句在表中即使插入了100多行,表上的INSERT語句級觸發器也只會執行一次。