鄧景順,黃 杰
(山西大同大學(xué)數(shù)學(xué)與計算機(jī)科學(xué)學(xué)院,山西大同 037009)
SQL Server中多行數(shù)據(jù)更新的觸發(fā)器應(yīng)用研究
鄧景順,黃 杰
(山西大同大學(xué)數(shù)學(xué)與計算機(jī)科學(xué)學(xué)院,山西大同 037009)
觸發(fā)器是一種特殊的存儲元件,它可以方便地基于一個表的數(shù)據(jù)更新,自動更新其他相關(guān)表的記錄,以保證數(shù)據(jù)的完整性.文章通過開發(fā)實(shí)例,闡述SQL Server中多行數(shù)據(jù)更新的觸發(fā)器處理方法.
SQL Server 多行數(shù)據(jù)更新 觸發(fā)器
數(shù)據(jù)更新操作有三種:向數(shù)據(jù)表中添加記錄、修改記錄、刪除記錄.在SQL Server觸發(fā)器應(yīng)用中,大家對由一個記錄更新操作激活的觸發(fā)器討論較多,而對一次更新操縱多個記錄陳述較少.本文重點(diǎn)在于,使用SQL Server 2005中的DML觸發(fā)器[1],闡述多行數(shù)據(jù)更新的觸發(fā)器處理方法.
本文使用的數(shù)據(jù)庫其中數(shù)據(jù)表及結(jié)構(gòu)為:
學(xué)生表:XSB(學(xué)號,姓名,專業(yè),總學(xué)分,…)
課程表:KCB(課程號,課程名,專業(yè),學(xué)分,…)
成績表:CJB(學(xué)號,課程號,成績)
其中XSB中總學(xué)分,應(yīng)為學(xué)生所選成績合格(>=60分)的課程,對應(yīng)的學(xué)分之和.
多行數(shù)據(jù)的更新舉例:
INSERT INTO XSB SELECT*FROM XSB1.
DELETE FROM XSBWHERE學(xué)號<'050001'.
UPDATE CJB SET成績=成績+10WHERE課程號='206'.
類似這些操作都會引起數(shù)據(jù)表中一行或多行記錄的更新操作.由這些操作引發(fā)的觸發(fā)器設(shè)計要比一個記錄時的情況復(fù)雜.
觸發(fā)器是一個被指定關(guān)聯(lián)到一個表的數(shù)據(jù)對象,觸發(fā)器是不需要調(diào)用的,當(dāng)對一個表的特別事件出現(xiàn)時(如INSERT、UPDATE、DELETE等),它就被激活[2].
SQL Server 2005中,按照觸發(fā)事件的不同可經(jīng)將觸發(fā)器分為兩大類:DML觸發(fā)器和DDL觸發(fā)器.當(dāng)DML觸發(fā)器被執(zhí)行時,系統(tǒng)創(chuàng)建了兩個特殊的邏輯表:inserted表和deleted表:
inserted表:當(dāng)向表中插入數(shù)據(jù)時,INSERT觸發(fā)器觸發(fā)執(zhí)行,新的記錄插入到觸發(fā)器表和inserted表中.
deleted表:用于保存已從表中刪除的記錄,當(dāng)觸發(fā)一個DELETE觸發(fā)器時,被刪除的記錄存放到deleted表中.
修改一條記錄等于插入一條新記錄,同時刪除舊記錄.當(dāng)對定義了UPDATE觸發(fā)器的表記錄修改時,表中原記錄移到deleted表,修改過的記錄插入到inserted表及被修改的表中.
這兩個表總是與被觸發(fā)的表有相同的結(jié)構(gòu),存儲在系統(tǒng)內(nèi)存中,不允許用戶對其修改,但用戶可以引用表中數(shù)據(jù),當(dāng)觸發(fā)器完成工作時,二表也被系統(tǒng)刪除[3,4].
在本文下面的方法中,都用到以上二個系統(tǒng)表.此外還會用到自定義的臨時表,用后需刪除.
1)XSB中插入一批不同專業(yè)新生后,應(yīng)該根據(jù)這些學(xué)生的專業(yè),在CJB中自動生成這些學(xué)生應(yīng)選課程記錄(學(xué)號,課程號),成績一列暫空.實(shí)現(xiàn)數(shù)據(jù)的自動填充.用XSB上的數(shù)據(jù)插入觸發(fā)器實(shí)現(xiàn):
2)修改KCB數(shù)據(jù)表中某些課程的學(xué)分,必然引起XSB中總學(xué)分?jǐn)?shù)據(jù)的不一致,應(yīng)該自動更新XSB中總學(xué)分,保持?jǐn)?shù)據(jù)一致性.用KCB上的數(shù)據(jù)更新觸發(fā)器實(shí)現(xiàn):
此方法特點(diǎn)是只針對更新學(xué)分的課程,把修改后的學(xué)分增量反映到總學(xué)分中,對學(xué)生本次操作以前的總學(xué)分并不作檢查和更新,處理問題相對靈活.
3)當(dāng)向CJB中插入多行記錄后,應(yīng)該根據(jù)學(xué)生的成績給出對應(yīng)的XSB中總學(xué)分更新.用CJB上的數(shù)據(jù)插入觸發(fā)器實(shí)現(xiàn):
4)當(dāng)向CJB中刪除多行記錄后,應(yīng)該根據(jù)學(xué)生的成績給出對應(yīng)的XSB中總學(xué)分更新.用CJB上的數(shù)據(jù)刪除觸發(fā)器實(shí)現(xiàn):
5)當(dāng)修改CJB中部分學(xué)生的成績后,應(yīng)該在XSB中的總學(xué)分中得到體現(xiàn).用CJB上的數(shù)據(jù)更新觸發(fā)器實(shí)現(xiàn):
此處需注意,及格分改為及格分,不及格分改為不及格分,并不改變學(xué)分;只有當(dāng)及格分改為不及格分或相反,才影響學(xué)分.
觸發(fā)器是一種特殊的存儲過程,它可以方便地基于一個表的修改,自動更新其他相關(guān)表的記錄,以保證數(shù)據(jù)的完整性.本文就多行數(shù)據(jù)更新操作的觸發(fā)器在數(shù)據(jù)庫的應(yīng)用,作了部分研究,主要方法是先將相關(guān)數(shù)據(jù)存入臨時數(shù)據(jù)表,再從臨時數(shù)據(jù)表中提取數(shù)據(jù)更新到指定數(shù)據(jù)表.?dāng)?shù)據(jù)的更新采用增量更新,對更新前的數(shù)據(jù)不作檢查,只反映本次操作所致的數(shù)據(jù)改變.希望本文提供的方法對其它數(shù)據(jù)庫的開發(fā)能有參考價值.
[1]鄭阿奇.SQLServer實(shí)用教程[M].北京:電子工業(yè)出版社,2009.
[2]王珊,薩師煊.數(shù)據(jù)庫系統(tǒng)概論[M].北京:高等教育出版社,2006.
[3]孫曉寧.SQL Server 2005中觸發(fā)器的應(yīng)用[J].中國科技信息,2008(1):73-74.
[4]張峰,張莉莉.觸發(fā)器在數(shù)據(jù)處理過程中的應(yīng)用研究[J].計算機(jī)工程與科學(xué),2008(05):156-158.
An Applied Study on the Trigger of the M ulti-line Data Update in SQL Server
DENG Jing-shun,HUANG Jie
(School ofMathematics and Computer Science,ShanxiDatong University,Datong Shanxi,037009)
A trigger is a special kind of stored procedure that can be executed automatically to update records in related tables based on datamodifications in a table in order to ensure the data integrity.In this article we shall discuss the application method to the trigger of themulti-line data update in SQL Server via a development example..
SQL Server;Multi_line Data Update;trigger
TP392
A
〔編輯 高海〕
1674-0874(2010)02-0005-03
2009-12-03
鄧景順(1964-),男,山西大同人,副教授,研究方向:數(shù)據(jù)庫.