鄧有林
(保山學(xué)院信息學(xué)院,云南保山678000)
SQL Server 2005中用觸發(fā)器實(shí)現(xiàn)數(shù)據(jù)庫(kù)的數(shù)據(jù)完整性研究
鄧有林
(保山學(xué)院信息學(xué)院,云南保山678000)
數(shù)據(jù)庫(kù)中的數(shù)據(jù)是從外界輸入的,輸入后面臨修改、刪除等操作,由于種種原因,會(huì)發(fā)生輸入無(wú)效或錯(cuò)誤信息。保證數(shù)據(jù)庫(kù)中數(shù)據(jù)的完整性,成為數(shù)據(jù)庫(kù)系統(tǒng),尤其是多用戶的關(guān)系數(shù)據(jù)庫(kù)系統(tǒng)首要關(guān)注的問(wèn)題。本文介紹了在SQL Server 2005數(shù)據(jù)庫(kù)系統(tǒng)中,用觸發(fā)器實(shí)現(xiàn)數(shù)據(jù)完整性的控制方法,并舉例說(shuō)明觸發(fā)器的實(shí)際應(yīng)用。
SQL Server 2005;數(shù)據(jù)完整性;觸發(fā)器
數(shù)據(jù)完整性是指數(shù)據(jù)庫(kù)中數(shù)據(jù)的正確性、有效性和相容性,為了防止數(shù)據(jù)庫(kù)中存在不符合語(yǔ)義規(guī)定的數(shù)據(jù)和防止系統(tǒng)輸入/輸出無(wú)效信息而提出的[2]P97。
觸發(fā)器是一種特殊類(lèi)型的存儲(chǔ)過(guò)程,這種存儲(chǔ)過(guò)程不能被用戶直接調(diào)用,而是通過(guò)事件進(jìn)行觸發(fā)而被執(zhí)行的[2]P206。它是一個(gè)強(qiáng)有力的工具,可以使商業(yè)的業(yè)務(wù)規(guī)則集成到數(shù)據(jù)庫(kù)中去,從而使其可以繞開(kāi)用戶控制,使系統(tǒng)在有數(shù)據(jù)修改時(shí)能夠強(qiáng)行執(zhí)行其業(yè)務(wù)規(guī)則。不但保證了數(shù)據(jù)的完整性,同時(shí)還保留了存儲(chǔ)過(guò)程高效率的特點(diǎn),為系統(tǒng)提供了良好的性能。
觸發(fā)器主要有如下優(yōu)點(diǎn):觸發(fā)器可以強(qiáng)制限制,設(shè)置復(fù)雜的約束,這些限制比CHECK約束所定義的更為復(fù)雜;對(duì)用戶透明,自動(dòng)執(zhí)行,當(dāng)對(duì)表中的數(shù)據(jù)作了任何修改后立即被激活;觸發(fā)器可以通過(guò)數(shù)據(jù)庫(kù)中的相關(guān)表實(shí)現(xiàn)級(jí)聯(lián)操作,進(jìn)行層疊更改;可以截獲用戶修改表時(shí)的輸入數(shù)據(jù),采取相應(yīng)的措施;一個(gè)表中的多個(gè)同類(lèi)觸發(fā)器(INSERT、UPDATE或DELETE)允許采取多個(gè)不同的對(duì)策以響應(yīng)同一個(gè)修改語(yǔ)句。
觸發(fā)器有著廣泛的應(yīng)用,但也存在著內(nèi)在的約束,具體限定機(jī)制如下:觸發(fā)器只在觸發(fā)它的語(yǔ)句完成后執(zhí)行,一個(gè)語(yǔ)句只能觸動(dòng)一次觸發(fā)器;如果語(yǔ)句在表中執(zhí)行違反條件約束或引起錯(cuò)誤,觸發(fā)器不會(huì)觸動(dòng);觸發(fā)器視為單一事務(wù)中的一部分,因此可以由原觸發(fā)器復(fù)原事務(wù),如果在事務(wù)過(guò)程中偵測(cè)到嚴(yán)重的錯(cuò)誤,則會(huì)自動(dòng)復(fù)原整個(gè)事務(wù);當(dāng)觸發(fā)器觸動(dòng)時(shí)若產(chǎn)生任何結(jié)果,就會(huì)將結(jié)果傳回其調(diào)用的應(yīng)用程序[2]P206。
在SQL Server 2005中,根據(jù)觸發(fā)事件的不同,觸發(fā)器可以分為兩類(lèi),一類(lèi)是DML觸發(fā)器,另一類(lèi)是DDL觸發(fā)器。其中DDL觸發(fā)器是SQLServer 2005的新增功能,當(dāng)服務(wù)器或數(shù)據(jù)庫(kù)中發(fā)生數(shù)據(jù)定義語(yǔ)言(DDL)事件時(shí)將調(diào)用該觸發(fā)器;DML觸發(fā)器是指當(dāng)數(shù)據(jù)庫(kù)中發(fā)生數(shù)據(jù)操作語(yǔ)言(DML)事件時(shí)被調(diào)用。
DML觸發(fā)器是當(dāng)服務(wù)器中發(fā)生數(shù)據(jù)操作語(yǔ)言(DML)事件時(shí)執(zhí)行的操作。DML觸發(fā)器包括三種類(lèi)型:AFTER觸發(fā)器、INSTEADOF觸發(fā)器、CLR觸發(fā)器。
AFTER觸發(fā)器在執(zhí)行了INSERT、UPDATE或DELETE語(yǔ)句操作之后執(zhí)行,INSTEADOF觸發(fā)器在INSERT、UPDATE或DELETE語(yǔ)句運(yùn)行時(shí)替代操作,CLR觸發(fā)器將執(zhí)行在托管代碼中(如.NETFramework)編寫(xiě)的方法,而非Transact-SQL存儲(chǔ)過(guò)程。
DDL觸發(fā)器是SQL Server 2005的新增功能,當(dāng)服務(wù)器或數(shù)據(jù)庫(kù)中發(fā)生數(shù)據(jù)定義語(yǔ)言DDL事件時(shí)將調(diào)用這些觸發(fā)器,在CREATE、ALTER、DROP和其他DDL語(yǔ)句上操作,用于執(zhí)行管理任務(wù)。
SQL Server 2005中的觸發(fā)器有DML和DDL兩種,本文主要介紹利用DML觸發(fā)器實(shí)現(xiàn)數(shù)據(jù)完整性。
SQL Server 2005觸發(fā)器在使用過(guò)程中,系統(tǒng)自動(dòng)為其創(chuàng)建Inserted和Deleted兩個(gè)臨時(shí)表,這兩個(gè)表固定存儲(chǔ)在與觸發(fā)器一起的內(nèi)存中,不存放在數(shù)據(jù)庫(kù)中,由系統(tǒng)自動(dòng)維護(hù)。這兩個(gè)臨時(shí)表的結(jié)構(gòu)與觸發(fā)器作用的數(shù)據(jù)表的結(jié)構(gòu)相同,存放被插入、刪除或更新的記錄的副本,每個(gè)觸發(fā)器只能訪問(wèn)自己的臨時(shí)表,觸發(fā)器工作完成后,與該觸發(fā)器相關(guān)的這兩個(gè)臨時(shí)表也會(huì)被自動(dòng)刪除。由于Inserted和Deleted兩個(gè)表中存放的是被操作的記錄的副本,所以,可以通過(guò)Select語(yǔ)句檢查Inserted和Deleted表中記錄,來(lái)實(shí)現(xiàn)數(shù)據(jù)的有效性、完整性和一致性的控制檢查。
本文以“學(xué)生成績(jī)管理”數(shù)據(jù)庫(kù)為例,在數(shù)據(jù)的插入、刪除和修改中,介紹利用觸發(fā)器實(shí)現(xiàn)數(shù)據(jù)的完整新、有效性和一致性的方法。該數(shù)據(jù)庫(kù)的主要表及其結(jié)構(gòu)如下:
學(xué)生(學(xué)號(hào),姓名,性別,班級(jí),出生日期,聯(lián)系電話)
課程(課程編號(hào),課程名稱(chēng),周學(xué)時(shí),學(xué)分)
成績(jī)(學(xué)號(hào),課程編號(hào),成績(jī))
根據(jù)該數(shù)據(jù)庫(kù)在實(shí)際應(yīng)用中的要求,學(xué)生表中的“學(xué)號(hào)”是主關(guān)鍵字,不允許重復(fù),“性別”必須是“男”或“女”;課程表的“課程編號(hào)”是主關(guān)鍵字,不允許重復(fù);成績(jī)表中的“學(xué)號(hào)”和“課程編號(hào)”是外部關(guān)鍵字,必須與學(xué)生表中的“學(xué)號(hào)”和課程表中的“課程編號(hào)”一致。在學(xué)生記錄的插入時(shí),應(yīng)檢查是否出現(xiàn)學(xué)號(hào)重復(fù),性別是否正確。
當(dāng)執(zhí)行INSERT語(yǔ)句往表中插入新記錄時(shí),插入的記錄被同時(shí)添加到inserted表中,將inserted表中的記錄與其他相關(guān)表中記錄作比對(duì),可以實(shí)現(xiàn)數(shù)據(jù)一致性的控制,對(duì)inserted表中的數(shù)據(jù)進(jìn)行分析,可以實(shí)現(xiàn)數(shù)據(jù)有效性和完整性的控制。
學(xué)生表插入記錄的觸發(fā)器設(shè)計(jì):
執(zhí)行DELETE語(yǔ)句刪除表中記錄時(shí),被刪除的記錄會(huì)被傳送到deleted表中,可以對(duì)deleted表中記錄進(jìn)行備份,以備以后查看及恢復(fù),也可以與其他表中數(shù)據(jù)進(jìn)行比對(duì),判斷記錄是否可以被刪除,例如,刪除學(xué)生記錄時(shí),如果該學(xué)生還存在成績(jī)信息就不能刪除。
執(zhí)行UPDATE語(yǔ)句更新表中數(shù)據(jù)時(shí),相當(dāng)于同時(shí)執(zhí)行DELETE和INSERT操作,修改前的記錄被保存到deleted表中,修改后的記錄被保存到inserted表中??梢岳眠@兩個(gè)臨時(shí)表,進(jìn)行記錄的級(jí)聯(lián)更新,例如,更新了學(xué)生表中的學(xué)號(hào),將一起更新成績(jī)表中相應(yīng)的學(xué)號(hào)。
更新學(xué)生記錄的觸發(fā)器設(shè)計(jì):
課程表的觸發(fā)器設(shè)計(jì),與學(xué)生表中記錄的增加、修改、刪除操作的觸發(fā)器設(shè)計(jì)是一樣的模式。
觸發(fā)器能保持?jǐn)?shù)據(jù)的完整性、有效性和一致性,當(dāng)對(duì)表中記錄進(jìn)行操作時(shí)可以對(duì)其進(jìn)行檢測(cè)控制,也可以方便地基于一個(gè)表的修改,自動(dòng)更新其他相關(guān)表的記錄,以保證數(shù)據(jù)的一致性。在數(shù)據(jù)庫(kù)的應(yīng)用中,觸發(fā)器扮演著很重要的角色,無(wú)論是作為提供高級(jí)參照完整性功能的途徑,還是執(zhí)行自動(dòng)維護(hù)非正規(guī)化數(shù)據(jù)的任務(wù),觸發(fā)器都能幫助用戶實(shí)現(xiàn)滿足實(shí)際需要的規(guī)則,簡(jiǎn)化業(yè)務(wù)邏輯,并使系統(tǒng)更方便更有效。
[1]劉曉玲.SQL Server中利用觸發(fā)器實(shí)現(xiàn)數(shù)據(jù)完整性[J].濟(jì)南職業(yè)學(xué)院學(xué)報(bào).2005(4)
[2]虞益誠(chéng).SQL Server 2005數(shù)據(jù)庫(kù)應(yīng)用技術(shù)(第二版)[M].北京:中國(guó)鐵道出版社,2004(12)
[3]焦華.數(shù)據(jù)庫(kù)技術(shù)及應(yīng)用[M].北京:地址出版社,2006(8)
[4]徐友武.SQLServer 2005觸發(fā)器應(yīng)用研究 [J].計(jì)算機(jī)與信息技術(shù),2009(9)
[5]馮洪峰.存儲(chǔ)過(guò)程在SQL Server 2005中應(yīng)用[J].電腦編程與技巧,2010(14)
[6]蘇志軍.淺析SQL Server 2005中的DDL觸發(fā)器技術(shù)[J].電腦學(xué)習(xí),2010(3)
[7]鐘亞妹.觸發(fā)器在SQL Server數(shù)據(jù)庫(kù)開(kāi)發(fā)中的應(yīng)用與研究[J].電腦知識(shí)與技術(shù),2011(11)
The Research of the Data Integrity of SQL Server 2005 with Trigger Realize Database
DENG You-Lin
(Baoshan collegeinformation institutein baoshan,Baoshan 678000,yunnan)
thedatain thedatabasefromoutsideof theinput,Then it facesafter modification and deletion of operation,it will occur input invalid or false information duetovariousreasons.Ensuretheintegrity of thedatain thedatabase,becomeadatabasesystem,especially many users database systemtop issue.Thispaper introducesthe SQLServer 2005 databasesystems,realizethe integrity of thedatawith flip-flop control method,and illustrate theactual application of thetrigger.
SQL Server 2005;dataintegrity;trigger
TP12
A
1671-5004(2011) 04-0023-03
2011-6-20
鄧有林(1977—),男,保山學(xué)院講師,在讀研究生,研究方向:計(jì)算機(jī)應(yīng)用技術(shù)、數(shù)據(jù)庫(kù)。
湖南工業(yè)職業(yè)技術(shù)學(xué)院學(xué)報(bào)2011年4期