李艷杰 曹金靜
摘 要:觸發(fā)器在程序設(shè)計語言中應(yīng)用廣泛,特別是在數(shù)據(jù)庫設(shè)計中占有舉足輕重的地位。它具有一觸即發(fā)的特點,數(shù)據(jù)庫中的表通常都是有聯(lián)系的,如果一個表中的數(shù)據(jù)更新,而另一個與它相關(guān)聯(lián)的表數(shù)據(jù)不更新,則會使兩個表中的數(shù)據(jù)不能保持一致,導(dǎo)致數(shù)據(jù)出現(xiàn)錯誤,而觸發(fā)器可以解決這個問題,使所有相關(guān)聯(lián)的表中的數(shù)據(jù)保持一致性,本文主要論述觸發(fā)器在SQL Server數(shù)據(jù)庫管理中是如何實現(xiàn)數(shù)據(jù)一致性的。
關(guān)鍵詞:觸發(fā)器;程序設(shè)計;SQL Server
中圖分類號:TP311.138 文獻標(biāo)識碼:A 文章編號:2096-4706(2019)04-0030-02
The Application of Trigger in Programming
LI Yanjie,CAO Jinjing
(College of Electronic Information Engineering,Shandong Huayu University of Technology,Dezhou 253034,China)
Abstract:Triggers are widely used in programming languages,especially in database design. It has the characteristics of hair-trigger. The tables in the database are usually related. If the data in one table is updated and the data in the other table is not updated,the data in the two tables will not be consistent,resulting in data errors. Triggers can solve this problem and make the data in all associated tables consistent. This paper mainly discusses how triggers achieve data consistency in SQL Server database management.
Keywords:trigger;program design;SQL Server
0 引 言
在SQL Server數(shù)據(jù)庫管理中,觸發(fā)器是一項非常重要的技術(shù),也是一種特殊的存儲過程,具有一觸即發(fā)的特點;它是基于一個表創(chuàng)建的,但是執(zhí)行時可以操作多個有聯(lián)系的表,所以可以對表實施復(fù)雜的完整性約束,當(dāng)與觸發(fā)器相關(guān)的表中數(shù)據(jù)發(fā)生改變時,觸發(fā)器被自動激活,從而防止對數(shù)據(jù)進行不正確的修改。
1 觸發(fā)器的作用
在數(shù)據(jù)庫中,觸發(fā)器能夠?qū)崿F(xiàn)主鍵和外鍵所不能保證的復(fù)雜的參照完整性和數(shù)據(jù)的一致性。舉例說明:主表為學(xué)生表(學(xué)號,姓名),主鍵為學(xué)號;子表為成績表(學(xué)號,成績),外鍵為學(xué)號,為兩個表建立完約束之后,則會有如下三條約束:一是子表中存在匹配的記錄,主表中不能刪除此記錄,也不能更改主鍵的值;二是主表中沒有的值,子表中也不能有;三是主表中的記錄可以多于子表。所以,如果學(xué)生表刪除(01,王建)這條記錄,數(shù)據(jù)庫會不允許刪除,因為成績表中存在此學(xué)號,但是利用觸發(fā)器可以實現(xiàn)兩個表中同時刪除。
2 觸發(fā)器的分類
觸發(fā)器分兩類:即DML觸發(fā)器和DDL觸發(fā)器。DML觸發(fā)器是當(dāng)數(shù)據(jù)庫中發(fā)生數(shù)據(jù)操作語言(DML)事件(即對表中數(shù)據(jù)進行插入、刪除、更新時)時執(zhí)行的操作;DDL觸發(fā)器是在響應(yīng)數(shù)據(jù)定義語言(DDL)事件時執(zhí)行的操作,DDL觸發(fā)器一般用于執(zhí)行數(shù)據(jù)庫中的管理任務(wù)。例如:對表的創(chuàng)建、修改和刪除,而非表中數(shù)據(jù)的。下面重點論述DML觸發(fā)器。
3 DML觸發(fā)器的工作原理
在SQL SERVER里,為每個DML觸發(fā)器都定義了兩個特殊的表,一個是插入(INSERTED)表,一個是刪除(DEL ETED)表。這兩個表是存在于數(shù)據(jù)庫服務(wù)器的內(nèi)存中的,是由系統(tǒng)管理的邏輯表,而不是真正存儲在數(shù)據(jù)庫中的物理表。INSERTED表對于插入記錄操作來說,INSERTED表里存放的是要插入的數(shù)據(jù);對于更新記錄操作來說,INSERTED表里存放的是更新后的記錄。DELETED表對于刪除記錄操作來說,DELETED表里存入的是被刪除的舊記錄;對于更新記錄操作來說,DELETED表里存放的是更新前的記錄。
3.1 DML觸發(fā)器的語法結(jié)構(gòu)
DML觸發(fā)器的語法結(jié)構(gòu)如下所示:
CREATE TRIGGER 觸發(fā)器名稱
ON 表名/視圖名
FOR\AFTER\INSERT OF
UPDATE,INSERT,DELETE
AS
BEGIN
T—SQL 語句
END
3.2 選擇After的應(yīng)用
其中AFTER(FOR早期版本使用)選項,只能用于基本表,INSTEAD OF選項用于基本表和視圖。當(dāng)選擇AFTER時,這類觸發(fā)器是在記錄已經(jīng)改變完之后,才會被激活執(zhí)行,它主要是用于記錄變更后的處理或檢查,一旦發(fā)現(xiàn)錯誤,也可以用ROLLBACK TRANSaCTION語句來回滾本次的操作。例:當(dāng)SQL SERVER接收到一個要執(zhí)行刪除操作的SQL語句時,SQL SERVER先將要刪除的記錄存放在刪除表里,然后把數(shù)據(jù)表里的記錄刪除,再激活A(yù)FTER觸發(fā)器,執(zhí)行AFTER觸發(fā)器里的T—SQL語句。執(zhí)行完畢之后,刪除內(nèi)存中的刪除表,退出整個操作。
案例說明:在電子商務(wù)數(shù)據(jù)庫中創(chuàng)建一個DML觸發(fā)器,實現(xiàn)在用戶信息表中刪除用戶時,顯示“某某用戶已被刪除”。
CREATE TRIGGERT1
ON USERS \\USERS為表的名稱
AFTER DELETE \\此處選擇DELETE
AS
BEGIN
DECLARE @A VARCHAR(30) \\聲明一個變量
SELECT @A=U_NAMEFROM DELETED
PRINT @A+'用戶已被刪除'
END
代碼完成之后,當(dāng)刪除USERS表中的一條記錄時,便會顯示此用戶已被刪除的結(jié)果。
3.3 選擇INSTEAD OF的應(yīng)用
一個表中只能建立一個INSTEAD OF觸發(fā)器,而AFTER可以建立多個。INSTEAD OF觸發(fā)器,是在插入、更新、刪除操作運行之前激活,不再去執(zhí)行原來的SQL操作,而去運行觸發(fā)器本身的SQL語句,而AFTER觸發(fā)器,即在記錄被更改或刪除之后才被觸發(fā)。
案例說明:創(chuàng)建觸發(fā)器,要求不能刪除電子商務(wù)數(shù)據(jù)庫中訂單表中的訂單記錄。
CREATE TRIGGERT2
ON ORDERS
INSTEAD OF DELETE
AS
PRINT '訂單不能被刪除'
當(dāng)執(zhí)行語句刪除訂單表中的記錄時,會彈出“訂單不能被刪除”。
4 綜合案例實現(xiàn)
建立兩個表,表一:XUESHENG(XUEHAO CHAR(6), XINGM CHAR(10)),輸入記錄為:(11,WANGLING,(12, LIMING),表二:CHENGJI(XUEHAO CHAR(6),CH EN GJIFLOAT),輸入記錄為:(11,80),(12,60)。
根據(jù)兩個表建立觸發(fā)器,要求當(dāng)在CHENGJI表中插入記錄時,如果學(xué)號不在XUESHENG表中,則提示信息:此學(xué)生不存在,不能插入成績,并加以驗證;當(dāng)在CHENGJI表中插入(13,90)這條記錄時,提示信息不能插入。
CREATE TRIGGER T3
ONCHENGJI
AFTER INSERT
AS
BEGIN
DECLARE @A CHAR(6)
SELECT @A=XUESHENG.XUEHAO
FROMXUESHENG,INSERTED
WHEREXUESHENG.XUEHAO=INSERTED.XUEHAO
IF @AIS NULL
BEGIN
ROLLBACK TRANSaCTION
PRINT '插入不成功,此學(xué)生不存在'
END
END
通過下面的插入語句驗證觸發(fā)器的執(zhí)行:
INSERTINTOCHENGJI VALUES(13,90)
執(zhí)行此語句時,會提示插入不成功,此學(xué)生不存在。因為此學(xué)生的學(xué)號在XUESHENG表中不存在,說明沒有學(xué)生存在,更不會有學(xué)生成績,也就不允許插入此記錄,所以通過觸發(fā)器可以讓多個表中的數(shù)據(jù)保持一致。
5 結(jié) 論
本文介紹了觸發(fā)器的含義、作用、分類、語法結(jié)構(gòu),以及對DML觸發(fā)器語法結(jié)構(gòu)中關(guān)鍵字的解釋,并舉例編寫代碼說明觸發(fā)器實現(xiàn)的過程,由此可見,對于多個表而言,若想實現(xiàn)程序設(shè)計中數(shù)據(jù)的參照完整性和數(shù)據(jù)的一致性,必須建立觸發(fā)器來解決,并且要注意是在已經(jīng)建好的表上建立觸發(fā)器,還是在數(shù)據(jù)庫上建立觸發(fā)器,級別不同,選擇的關(guān)鍵字也不同,實現(xiàn)的功能也不同。
參考文獻:
[1] 劉丹,李楠.SQL Server觸發(fā)器探析 [J].信息與電腦(理論版),2015(15):105-106+111.
[2] 邱吉苗,竺東杰,方飛波,等.基于醫(yī)囑觸發(fā)器技術(shù)的藥品不良反應(yīng)監(jiān)測研究 [J].中國數(shù)字醫(yī)學(xué),2016,11(9):56-57.
[3] 張海越,范曦.觸發(fā)器在SQL Server數(shù)據(jù)庫中使用的分析與研究 [J].數(shù)字技術(shù)與應(yīng)用,2016(2):77.
[4] 陳雅.SQL Server數(shù)據(jù)庫中觸發(fā)器的應(yīng)用研究 [J].電腦知識與技術(shù),2017,13(12):1-2+12.
[5] 何勰緋.探析觸發(fā)器在大型數(shù)據(jù)庫中的應(yīng)用 [J].中國信息化,2018(11):48-49.
作者簡介:李艷杰(1978-),女,漢族,山東德州人,講師,碩士,主要研究方向:數(shù)據(jù)挖掘技術(shù);曹金靜(1983-),女,漢族,山東德州人,教師,講師,碩士,研究方向:電子信息、軟件開發(fā)。