鄧景順,黃 杰
(山西大同大學(xué)數(shù)學(xué)與計(jì)算機(jī)科學(xué)學(xué)院,山西大同 037009)
SQL Server中多行數(shù)據(jù)更新的觸發(fā)器應(yīng)用研究
鄧景順,黃 杰
(山西大同大學(xué)數(shù)學(xué)與計(jì)算機(jī)科學(xué)學(xué)院,山西大同 037009)
觸發(fā)器是一種特殊的存儲(chǔ)元件,它可以方便地基于一個(gè)表的數(shù)據(jù)更新,自動(dòng)更新其他相關(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)用中,大家對(duì)由一個(gè)記錄更新操作激活的觸發(fā)器討論較多,而對(duì)一次更新操縱多個(gè)記錄陳述較少.本文重點(diǎn)在于,使用SQL Server 2005中的DML觸發(fā)器[1],闡述多行數(shù)據(jù)更新的觸發(fā)器處理方法.
本文使用的數(shù)據(jù)庫(kù)其中數(shù)據(jù)表及結(jié)構(gòu)為:
學(xué)生表:XSB(學(xué)號(hào),姓名,專業(yè),總學(xué)分,…)
課程表:KCB(課程號(hào),課程名,專業(yè),學(xué)分,…)
成績(jī)表:CJB(學(xué)號(hào),課程號(hào),成績(jī))
其中XSB中總學(xué)分,應(yīng)為學(xué)生所選成績(jī)合格(>=60分)的課程,對(duì)應(yīng)的學(xué)分之和.
多行數(shù)據(jù)的更新舉例:
INSERT INTO XSB SELECT*FROM XSB1.
DELETE FROM XSBWHERE學(xué)號(hào)<'050001'.
UPDATE CJB SET成績(jī)=成績(jī)+10WHERE課程號(hào)='206'.
類似這些操作都會(huì)引起數(shù)據(jù)表中一行或多行記錄的更新操作.由這些操作引發(fā)的觸發(fā)器設(shè)計(jì)要比一個(gè)記錄時(shí)的情況復(fù)雜.
觸發(fā)器是一個(gè)被指定關(guān)聯(lián)到一個(gè)表的數(shù)據(jù)對(duì)象,觸發(fā)器是不需要調(diào)用的,當(dāng)對(duì)一個(gè)表的特別事件出現(xiàn)時(shí)(如INSERT、UPDATE、DELETE等),它就被激活[2].
SQL Server 2005中,按照觸發(fā)事件的不同可經(jīng)將觸發(fā)器分為兩大類:DML觸發(fā)器和DDL觸發(fā)器.當(dāng)DML觸發(fā)器被執(zhí)行時(shí),系統(tǒng)創(chuàng)建了兩個(gè)特殊的邏輯表:inserted表和deleted表:
inserted表:當(dāng)向表中插入數(shù)據(jù)時(shí),INSERT觸發(fā)器觸發(fā)執(zhí)行,新的記錄插入到觸發(fā)器表和inserted表中.
deleted表:用于保存已從表中刪除的記錄,當(dāng)觸發(fā)一個(gè)DELETE觸發(fā)器時(shí),被刪除的記錄存放到deleted表中.
修改一條記錄等于插入一條新記錄,同時(shí)刪除舊記錄.當(dāng)對(duì)定義了UPDATE觸發(fā)器的表記錄修改時(shí),表中原記錄移到deleted表,修改過的記錄插入到inserted表及被修改的表中.
這兩個(gè)表總是與被觸發(fā)的表有相同的結(jié)構(gòu),存儲(chǔ)在系統(tǒng)內(nèi)存中,不允許用戶對(duì)其修改,但用戶可以引用表中數(shù)據(jù),當(dāng)觸發(fā)器完成工作時(shí),二表也被系統(tǒng)刪除[3,4].
在本文下面的方法中,都用到以上二個(gè)系統(tǒng)表.此外還會(huì)用到自定義的臨時(shí)表,用后需刪除.
1)XSB中插入一批不同專業(yè)新生后,應(yīng)該根據(jù)這些學(xué)生的專業(yè),在CJB中自動(dòng)生成這些學(xué)生應(yīng)選課程記錄(學(xué)號(hào),課程號(hào)),成績(jī)一列暫空.實(shí)現(xiàn)數(shù)據(jù)的自動(dòng)填充.用XSB上的數(shù)據(jù)插入觸發(fā)器實(shí)現(xiàn):
2)修改KCB數(shù)據(jù)表中某些課程的學(xué)分,必然引起XSB中總學(xué)分?jǐn)?shù)據(jù)的不一致,應(yīng)該自動(dòng)更新XSB中總學(xué)分,保持?jǐn)?shù)據(jù)一致性.用KCB上的數(shù)據(jù)更新觸發(fā)器實(shí)現(xiàn):
此方法特點(diǎn)是只針對(duì)更新學(xué)分的課程,把修改后的學(xué)分增量反映到總學(xué)分中,對(duì)學(xué)生本次操作以前的總學(xué)分并不作檢查和更新,處理問題相對(duì)靈活.
3)當(dāng)向CJB中插入多行記錄后,應(yīng)該根據(jù)學(xué)生的成績(jī)給出對(duì)應(yīng)的XSB中總學(xué)分更新.用CJB上的數(shù)據(jù)插入觸發(fā)器實(shí)現(xiàn):
4)當(dāng)向CJB中刪除多行記錄后,應(yīng)該根據(jù)學(xué)生的成績(jī)給出對(duì)應(yīng)的XSB中總學(xué)分更新.用CJB上的數(shù)據(jù)刪除觸發(fā)器實(shí)現(xiàn):
5)當(dāng)修改CJB中部分學(xué)生的成績(jī)后,應(yīng)該在XSB中的總學(xué)分中得到體現(xiàn).用CJB上的數(shù)據(jù)更新觸發(fā)器實(shí)現(xiàn):
此處需注意,及格分改為及格分,不及格分改為不及格分,并不改變學(xué)分;只有當(dāng)及格分改為不及格分或相反,才影響學(xué)分.
觸發(fā)器是一種特殊的存儲(chǔ)過程,它可以方便地基于一個(gè)表的修改,自動(dòng)更新其他相關(guān)表的記錄,以保證數(shù)據(jù)的完整性.本文就多行數(shù)據(jù)更新操作的觸發(fā)器在數(shù)據(jù)庫(kù)的應(yīng)用,作了部分研究,主要方法是先將相關(guān)數(shù)據(jù)存入臨時(shí)數(shù)據(jù)表,再?gòu)呐R時(shí)數(shù)據(jù)表中提取數(shù)據(jù)更新到指定數(shù)據(jù)表.?dāng)?shù)據(jù)的更新采用增量更新,對(duì)更新前的數(shù)據(jù)不作檢查,只反映本次操作所致的數(shù)據(jù)改變.希望本文提供的方法對(duì)其它數(shù)據(jù)庫(kù)的開發(fā)能有參考價(jià)值.
[1]鄭阿奇.SQLServer實(shí)用教程[M].北京:電子工業(yè)出版社,2009.
[2]王珊,薩師煊.數(shù)據(jù)庫(kù)系統(tǒng)概論[M].北京:高等教育出版社,2006.
[3]孫曉寧.SQL Server 2005中觸發(fā)器的應(yīng)用[J].中國(guó)科技信息,2008(1):73-74.
[4]張峰,張莉莉.觸發(fā)器在數(shù)據(jù)處理過程中的應(yīng)用研究[J].計(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ù)庫(kù).