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