張 宇
武漢軟件工程職業學院,湖北 武漢 430033
設計觸發器時,理解觸發器的工作方式非常重要。在觸發器的執行過程中,對每個數據庫表會應用到兩個臨時表:inserted表和deleted表,這是兩個僅在內存中的表,結構與定義觸發器的表一樣,但用戶不能直接對表中的數據進行操作,原表中數據的更新過程將經常應用到這兩個臨時表,各更新操作過程中inserted表和deleted表所起的作用見表1。

表1 數據更新與表的記錄
以下以學生數據庫為例討論INSERT觸發器、UPDATE觸發器、DELETE觸發器、INSTEAD OF觸發器工作原理及應用。
創建學生成績數據庫st,包含三個表:學生表,課程表和成績表。
當試圖向一個觸發器保護的表中插入一行數據時,INSERT觸發器將被激活。在插入操作過程中,插入的數據記錄在inserted表中,執行插入的過程為:
1)向定義了INSERT觸發器的表發送INSERT語句;
2)INSERT語句記錄到日志中;
3)執行觸發器動作。
當INSERT觸發器被激發時,新的數據行被添加到表中,同時被插入數據行的副本也被添加到臨時表inserted表中,然后,觸發器中定義的語句接著被執行。觸發器也可以檢查inserted表,確定是否執行觸發器動作和如何執行觸發器動作。
為學生表創建插入觸發器,當在學生表中插入學生時,在成績表中插入該生所有課程的成績記錄,成績為NULL。代碼如下:

當更新定義有UPDATE觸發器的表中的數據時,UPDATE操作將激發對應的觸發器,執行更新時,UDPATE語句向deleted表中添加將被更新的行在更新前的原始數據行副本,把更新后的數據行副本添加到inserted表中,然后執行解發器中定義的語句,執行過程為:
1)向表發送UPDATE語句;
2)在日志中以INSERT和DELETE語句方式記錄UPDATE語句;
3)觸發器可以檢查deleted表和inserted表以及被更新的庫表,確定是否更新多行以及如何執行觸發器動作。在觸發器中,可以通過IF UPDATE語句監控特定列數據是否被更新,當被監測列被更新時,觸發器可以采取相應的動作。
為學生表創建更新觸發器,當更新學生表中學生的學號時,在成績表中也相應更新該生的學號信息。代碼如下:

當試圖刪除定義了DELETE觸發器的表中數據行時,DELETE觸發器被激發。DELETE操作在刪除數據行時,將被刪除行的一個副本插入到deleted表中,執行過程為:
1)向表發送DELETE語句;
2)在日志中記錄DELETE語句;
3)執行觸發器動作。
在DELETE語句的執行過程中被插入到deleted表中的數據行,不再存在于原數據表中,所以原數據表和deleted表中不會有共同的數據行。
注意:為DELETE語句定義的觸發器對TRUNCATE TABLE語句并不執行,因為TRUNCATE TABLE語句不記錄到日志中。
為學生表創建刪除觸發器,當刪除學生表中的學生時,成績表中該生的所有成績也相應刪除。代碼如下:

INSTEAD OF觸發器取消所有的觸發動作,原來的觸發動作(插入、更新或刪除)不再發生,并執行相應的替代功能。INSTEAD OF觸發器增加了可用于表和視圖的各種類型的更新操作,當需要使用通常不可更新的視圖支持數據修改時,INSTEAD OF觸發器可以通過內含SQL語句完成數據的更新操作。
對每一種觸發動作,每個表或視圖只能有一個INSTEAD OF觸發器,但在帶有WITH CHECK OPTION定義的視圖中不能創建INSTEAD OF觸發器。
為學生表創建instead of觸發器,當插入學生的年齡小于30時才插入學生表

[1]薩師煊,王珊.數據庫系統概論[M].高等教育出版社,2004,1.
[2]王路群.數據庫原理與SQL Server教程[M].人民郵電出版社,2006,4.
[3]微軟公司.SQL Server 2005數據庫開發與實現[M].高等教育出版社,2007,9.