摘 要: 本文介紹了SQL Server觸發(fā)器的概念和類型,總結(jié)了SQL Server觸發(fā)器在程序設計中的應用,并給出了SQL Server觸發(fā)器的應用實例。
關鍵詞: SQL Server 觸發(fā)器 應用實例
1.引言
在大型關系數(shù)據(jù)庫設計中,如何保證數(shù)據(jù)庫中的數(shù)據(jù)完整性是一項重要的研究內(nèi)容。數(shù)據(jù)完整性是指存儲在數(shù)據(jù)庫中的數(shù)據(jù)的一致性。主要體現(xiàn)在實體完整性、域完整性、參照完整性和用戶的自定義完整性等方面。雖然從最基本的數(shù)據(jù)類型到多種形式的約束條件,都提出了數(shù)據(jù)完整性的解決方案,但這些方法較為簡單,不能解決比較復雜的數(shù)據(jù)完整性問題。而觸發(fā)器作為一種高級的技術(shù),可以輕松地解決任何有關保證數(shù)據(jù)完整性的問題。
觸發(fā)器一旦被定義,就存在于后臺數(shù)據(jù)庫系統(tǒng)中,并會往表中插入記錄、更改記錄或者刪除記錄時,被自動地隱式執(zhí)行,從而使得它的設計既與前臺的平臺無關,又免除了前臺相關的數(shù)據(jù)操作設計。因此,觸發(fā)器可以用來對表實施復雜的完整性約束,當觸發(fā)器所保護的數(shù)據(jù)發(fā)生改變時,觸發(fā)器會自動被激活,從而防止對數(shù)據(jù)的不正確修改[1]。
2.觸發(fā)器的概念
觸發(fā)器是SQL Server為應用程序開發(fā)人員提供的一種保證數(shù)據(jù)庫中數(shù)據(jù)完整性的方法,它是一種特殊的存儲過程,但它和一般的存儲過程有本質(zhì)的區(qū)別,存儲過程可以由用戶直接調(diào)用執(zhí)行,而觸發(fā)器不能被直接調(diào)用執(zhí)行。觸發(fā)器主要是通過事件進行觸發(fā)而被執(zhí)行的,而存儲過程可以通過存儲過程名字而被直接調(diào)用。當對某一表進行Update,Insert,Delete操作時,SQL Server就會自動執(zhí)行觸發(fā)器所定義的SQL語句。
利用觸發(fā)器可以比較數(shù)據(jù)修改前和修改后的狀態(tài)。通過Insert,Update語句,觸發(fā)器可以提供參考數(shù)據(jù)變化的能力,這樣就允許參考被觸發(fā)器中修改語句影響到的記錄。
使用觸發(fā)器可以維護非規(guī)范化的數(shù)據(jù),可以使用觸發(fā)器維護非正規(guī)化數(shù)據(jù)庫環(huán)境中的行級數(shù)據(jù)完整性[2]。
3.觸發(fā)器的種類
根據(jù)觸發(fā)器被激活的時機不同,SQL Server中提供了兩種類型的觸發(fā)器:INSTEAD OF觸發(fā)器和AFTER觸發(fā)器。
AFTER觸發(fā)器在一個INSERT、UPDATE或DELETE語句完成之后執(zhí)行,進行約束檢查等動作都將在AFTER觸發(fā)器被激活之前發(fā)生。AFTER觸發(fā)器只能用于表。
INSTEAD OF觸發(fā)器用于替代引起觸發(fā)器執(zhí)行的T-SQL語句。除表之外,INSTEAD OF觸發(fā)器也可以用于視圖,用來擴展視圖可以支持的更新操作。
一個表或視圖的每個修改動作(INSERT、UPDATE和DELETE)都可以有一個INSTEAD OF觸發(fā)器,但可以有多個AFTER觸發(fā)器[3]。
4.觸發(fā)器的實現(xiàn)
觸發(fā)器的實現(xiàn)離不了兩個專用表:Inserted表和Deleted表。這是兩個邏輯表,由系統(tǒng)來維護,用戶不能對它們進行修改。它們存放在內(nèi)存而不是數(shù)據(jù)庫中。這兩個表的結(jié)構(gòu)總是與激活該觸發(fā)器的表的結(jié)構(gòu)相同。觸發(fā)器執(zhí)行完成后,與該觸發(fā)器相關的這兩個表也會被刪除。
當向觸發(fā)器表中插入數(shù)據(jù)時,新的記錄會增加到觸發(fā)器表和inserted表中;當刪除觸發(fā)器表中的數(shù)據(jù)時,被刪除的記錄會存放到deleted表中;當更新觸發(fā)器表中的數(shù)據(jù)時,相當于插入一條新記錄和刪除一條舊記錄,此時表中原有的記錄存放到deleted表中,修改后的記錄插入到inserted表中。
在創(chuàng)建觸發(fā)器時需要制定以下內(nèi)容:觸發(fā)器的名稱、觸發(fā)器所基于的表或視圖、觸發(fā)器種類(AFTER或INSTEAD OF)、激活觸發(fā)器的修改語句(INSERT、UPDATE和DELETE)、觸發(fā)器執(zhí)行的語句,用T-SQL語句創(chuàng)建觸發(fā)器的具體語法如下[4]:
CREATE Trigger trigger_name
ON { table_name | view_name }
{ AFTER | INSTEAD OF }
[INSERT,UPDATE,DELETE ]
AS
Sq_Statement
5.觸發(fā)器應用實例
實例1:本例說明了觸發(fā)器如何在選課表choice中維護數(shù)據(jù)的完整性。當向choice表插入一條記錄時,檢查該記錄的學號在學生表student中是否存在,檢查課程號在課程表course中是否存在,若有一項為否,則不允許插入。
CREATE TRIGGER choice_ins_trigger
ON choice
FOR INSERT
AS
IF EXISTS(select * from inserted
Where inserted.學號 NOT IN(select student.學號 from student)OR
Inserted.課程號 NOT IN(select course.課程號 from course))
BEGIN
PRINT ″此記錄無法插入!″
ROLLBACK TRANSACTION
END
ELSE
PRINT ″該記錄已被插入!″
實例2:為學生表student建立一個After Delete觸發(fā)器,當要刪除學生表中某個學生的記錄時,相應的要把該學生在學生成績表score中的成績記錄刪除,否則會造成數(shù)據(jù)冗余。
CREATE TRIGGER stusco_del_trigger
ON student
AFTER DELETE
AS
DECLARE @AK2 CHAR(10)
SELECT @AK2=學號 FROM deleted
Delete score WHERE 學號=@AK2
RETURN
實例3:本例說明了觸發(fā)器如何強制實施業(yè)務規(guī)則。在圖書管理系統(tǒng)中,當刪除Readers表中的讀者信息時,通過DELETE觸發(fā)器檢查該借閱者是否還有書籍尚未歸還,如果有就取消刪除操作(回滾事務),并返回相關提示信息。
CREATE TRIGGER reader_del_trigger
ON readers
FOR DELETE
AS
DECLARE @data_js int
SELECT @data_js=已借數(shù)量 FROM deleted
IF @data_js>0
BEGIN
PRINT ″還有″+RTRIM(@data_js)+″本書沒還。″
ROLLBACK TRANSACTION
END
ELSE
PRINT ″該讀者已被刪除!″
6.結(jié)語
本文研究了開發(fā)SQL Server 2000觸發(fā)器的技術(shù)及其應用。觸發(fā)器是一種非常重要的應用邏輯,它可以完成復雜的數(shù)據(jù)完整性和一致性的工作。掌握開發(fā)觸發(fā)器的技術(shù),編寫出高效率的觸發(fā)器邏輯,是數(shù)據(jù)庫應用程序開發(fā)成功的重要保障。
參考文獻:
[1]張蒲生,何升.SQL Server數(shù)據(jù)庫應用技術(shù)[M].北京:清華大學出版社,2005.
[2] 陸昌輝,吳曉華.SQL Server 2000核心技術(shù)揭密[M].北京:宇航出版社,2002.
[3]徐曉麗.巧妙應用SQL Server觸發(fā)器[J].微型電腦應用,2010.
[4]張丹.SQL Server中存儲過程與觸發(fā)器技術(shù)的研究與應用[J].科技創(chuàng)新導報,2008.