張 宇
武漢軟件工程職業(yè)學(xué)院,湖北 武漢 430033
設(shè)計觸發(fā)器時,理解觸發(fā)器的工作方式非常重要。在觸發(fā)器的執(zhí)行過程中,對每個數(shù)據(jù)庫表會應(yīng)用到兩個臨時表:inserted表和deleted表,這是兩個僅在內(nèi)存中的表,結(jié)構(gòu)與定義觸發(fā)器的表一樣,但用戶不能直接對表中的數(shù)據(jù)進(jìn)行操作,原表中數(shù)據(jù)的更新過程將經(jīng)常應(yīng)用到這兩個臨時表,各更新操作過程中inserted表和deleted表所起的作用見表1。
表1 數(shù)據(jù)更新與表的記錄
以下以學(xué)生數(shù)據(jù)庫為例討論INSERT觸發(fā)器、UPDATE觸發(fā)器、DELETE觸發(fā)器、INSTEAD OF觸發(fā)器工作原理及應(yīng)用。
創(chuàng)建學(xué)生成績數(shù)據(jù)庫st,包含三個表:學(xué)生表,課程表和成績表。
當(dāng)試圖向一個觸發(fā)器保護(hù)的表中插入一行數(shù)據(jù)時,INSERT觸發(fā)器將被激活。在插入操作過程中,插入的數(shù)據(jù)記錄在inserted表中,執(zhí)行插入的過程為:
1)向定義了INSERT觸發(fā)器的表發(fā)送INSERT語句;
2)INSERT語句記錄到日志中;
3)執(zhí)行觸發(fā)器動作。
當(dāng)INSERT觸發(fā)器被激發(fā)時,新的數(shù)據(jù)行被添加到表中,同時被插入數(shù)據(jù)行的副本也被添加到臨時表inserted表中,然后,觸發(fā)器中定義的語句接著被執(zhí)行。觸發(fā)器也可以檢查inserted表,確定是否執(zhí)行觸發(fā)器動作和如何執(zhí)行觸發(fā)器動作。
為學(xué)生表創(chuàng)建插入觸發(fā)器,當(dāng)在學(xué)生表中插入學(xué)生時,在成績表中插入該生所有課程的成績記錄,成績?yōu)镹ULL。代碼如下:
當(dāng)更新定義有UPDATE觸發(fā)器的表中的數(shù)據(jù)時,UPDATE操作將激發(fā)對應(yīng)的觸發(fā)器,執(zhí)行更新時,UDPATE語句向deleted表中添加將被更新的行在更新前的原始數(shù)據(jù)行副本,把更新后的數(shù)據(jù)行副本添加到inserted表中,然后執(zhí)行解發(fā)器中定義的語句,執(zhí)行過程為:
1)向表發(fā)送UPDATE語句;
2)在日志中以INSERT和DELETE語句方式記錄UPDATE語句;
3)觸發(fā)器可以檢查deleted表和inserted表以及被更新的庫表,確定是否更新多行以及如何執(zhí)行觸發(fā)器動作。在觸發(fā)器中,可以通過IF UPDATE語句監(jiān)控特定列數(shù)據(jù)是否被更新,當(dāng)被監(jiān)測列被更新時,觸發(fā)器可以采取相應(yīng)的動作。
為學(xué)生表創(chuàng)建更新觸發(fā)器,當(dāng)更新學(xué)生表中學(xué)生的學(xué)號時,在成績表中也相應(yīng)更新該生的學(xué)號信息。代碼如下:
當(dāng)試圖刪除定義了DELETE觸發(fā)器的表中數(shù)據(jù)行時,DELETE觸發(fā)器被激發(fā)。DELETE操作在刪除數(shù)據(jù)行時,將被刪除行的一個副本插入到deleted表中,執(zhí)行過程為:
1)向表發(fā)送DELETE語句;
2)在日志中記錄DELETE語句;
3)執(zhí)行觸發(fā)器動作。
在DELETE語句的執(zhí)行過程中被插入到deleted表中的數(shù)據(jù)行,不再存在于原數(shù)據(jù)表中,所以原數(shù)據(jù)表和deleted表中不會有共同的數(shù)據(jù)行。
注意:為DELETE語句定義的觸發(fā)器對TRUNCATE TABLE語句并不執(zhí)行,因為TRUNCATE TABLE語句不記錄到日志中。
為學(xué)生表創(chuàng)建刪除觸發(fā)器,當(dāng)刪除學(xué)生表中的學(xué)生時,成績表中該生的所有成績也相應(yīng)刪除。代碼如下:
INSTEAD OF觸發(fā)器取消所有的觸發(fā)動作,原來的觸發(fā)動作(插入、更新或刪除)不再發(fā)生,并執(zhí)行相應(yīng)的替代功能。INSTEAD OF觸發(fā)器增加了可用于表和視圖的各種類型的更新操作,當(dāng)需要使用通常不可更新的視圖支持?jǐn)?shù)據(jù)修改時,INSTEAD OF觸發(fā)器可以通過內(nèi)含SQL語句完成數(shù)據(jù)的更新操作。
對每一種觸發(fā)動作,每個表或視圖只能有一個INSTEAD OF觸發(fā)器,但在帶有WITH CHECK OPTION定義的視圖中不能創(chuàng)建INSTEAD OF觸發(fā)器。
為學(xué)生表創(chuàng)建instead of觸發(fā)器,當(dāng)插入學(xué)生的年齡小于30時才插入學(xué)生表
[1]薩師煊,王珊.數(shù)據(jù)庫系統(tǒng)概論[M].高等教育出版社,2004,1.
[2]王路群.數(shù)據(jù)庫原理與SQL Server教程[M].人民郵電出版社,2006,4.
[3]微軟公司.SQL Server 2005數(shù)據(jù)庫開發(fā)與實現(xiàn)[M].高等教育出版社,2007,9.