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