孟慶芳
摘要:在SQL Server數(shù)據(jù)庫中為了對數(shù)據(jù)庫表實施復(fù)雜的完整性約束,觸發(fā)器是比較理想的選擇工具。它可以對數(shù)據(jù)庫表進行級聯(lián)修改,保持?jǐn)?shù)據(jù)的一致性。它的執(zhí)行是由事件來觸發(fā),當(dāng)對一個表進行插入、更新、刪除操作時就會激活它執(zhí)行,從而通過觸發(fā)器的執(zhí)行更好地實現(xiàn)數(shù)據(jù)的完整性約束和業(yè)務(wù)規(guī)則等。
關(guān)鍵詞:SQL Serve;數(shù)據(jù)庫;觸發(fā)器;工作過程;維護
中圖分類號:TP313 文獻標(biāo)識碼:A 文章編號:1009-3044(2014)32-7582-03
Abstract: In the SQL Server database to form the integrity constraints on the database to implement complex, the trigger is ideal selection tool. It can be cascaded to modify the database table, the maintenance of data consistency. It is implemented by the event to trigger, when on a table to insert, update, delete operations will activate it execution, thus through the execution of triggers to better achieve the integrity constraints andbusiness rules, data etc..
Key words: SQL Serve; database; triggers; work process; maintain
在數(shù)據(jù)庫管理系統(tǒng)中,常常會進行數(shù)據(jù)的插入、更新、刪除等操作,在此操作過程中保持?jǐn)?shù)據(jù)的完整性是非常重要的一項工作。當(dāng)一些普通的維護方法不能滿足要求時我們就要考慮用到觸發(fā)器了。
1 觸發(fā)器的特點
觸發(fā)器是一種特殊的存儲過程,其特殊性在于它并不需要由用戶來直接調(diào)用,而是在對表或視圖進行插入記錄、更改記錄或者刪除記錄時自動執(zhí)行的。
2 觸發(fā)器的使用場合
實現(xiàn)對相關(guān)表的級聯(lián)修改;拒絕或回滾違反引用完整性的操作;完成比CHECK約束更復(fù)雜的限制;檢查修改前后表中數(shù)據(jù)的不同并執(zhí)行相應(yīng)的操作。
3 觸發(fā)器3種操作的實現(xiàn)過程
DML觸發(fā)器在執(zhí)行過程中可以使用兩個特殊的臨時表—deleted表和inserted表。這兩個表存儲于內(nèi)存中,它們在結(jié)構(gòu)上與觸發(fā)器所在的表的結(jié)構(gòu)相同。
deleted表用于存儲delete、update語句所影響的行的副本。在執(zhí)行delete或update語句時,數(shù)據(jù)行從觸發(fā)器表中刪除,并傳輸?shù)絛eleted表中。
inserted表用于存儲insert、update語句所影響的行的副本,在一個插入或更新事務(wù)處理中,新建行被同時添加到更新操作的表和insered表中。insered表中的行是觸發(fā)器表中新行的副本。
兩個表由系統(tǒng)管理,不允許用戶直接對其進行修改,但可以訪問。觸發(fā)器工作完成后,與該觸發(fā)器相關(guān)的這兩個表也將被刪除。
現(xiàn)通過實例說明觸發(fā)器的妙用之處:studentinfo數(shù)據(jù)庫包括學(xué)生表student(學(xué)號SNO,姓名SNAME,系名DEPART,性別SEX,出生日期DDATE)、課程表Course(課程編號CNO,課程名稱CNAME)和成績表score(學(xué)號SNO,課程編號CNO,成績GRADE)
3.1 Insert觸發(fā)器的工作過程
Insert觸發(fā)器是當(dāng)用INSERT語句向表中插入數(shù)據(jù)時都會執(zhí)行的觸發(fā)器。
當(dāng)觸發(fā)INSERT觸發(fā)器時,新的數(shù)據(jù)行就會被插入到觸發(fā)器表和inserted表中。inserted表是一個邏輯表,它包含了已經(jīng)插入的數(shù)據(jù)行的一個副本。inserted表包含了INSERT語句中已記錄的插入動作。inserted表還允許引用由初始化INSERT語句而產(chǎn)生的日志數(shù)據(jù)。
例如:創(chuàng)建一個觸發(fā)器。當(dāng)向student表中插入一條學(xué)生記錄時引發(fā)該觸發(fā)器,向scores表中插入兩行數(shù)據(jù)。
Use studentinfo
Go
Create trigger insert_score_trigger
On student
For insert as
Set nocount off
Declare @st_no int
Select @stno=學(xué)號 from inserted
Insert into score(sno,cno) Values (@st_no,1)
Insert into score(sno,cno) Values (@st_no,2)
Go
Insert into student(sno,sname,depart,sex,ddate)
Values(‘2012001,王平,計算機科學(xué)技術(shù),男,1993-3-9)
Select score.sno as 學(xué)號,sname as 姓名,course as 課程,score as 成績
From score as sc inner join student as s on s.sno=sc.sno
Inner join course as c on sc.cno=c.cno
Where sname=王平
go
3.2 DELETE觸發(fā)器的工作過程
deleted表是一個邏輯表,它存放已被刪除數(shù)據(jù)行的一個副本。當(dāng)觸發(fā)delete觸發(fā)器后,從受影響的表中刪除的行將被放置到該特殊的表中。
例如:在student表上創(chuàng)建一個觸發(fā)器trigger_delete,當(dāng)刪除student表中某個同學(xué)的記錄信息時,score表中與該同學(xué)相關(guān)的成績信息也自動被刪除。
Use Studentinfo
Go
if exists (select name from sysobjects
where name=' trigger_delete' and type='tr')
drop trigger trigger_delete
go
create trigger trigger_delete
on student
for delete
as
delete score
where sno=(select sno from deleted)
go
3.3 UPDATE觸發(fā)器的工作過程
可將UPDATE語句看成兩步操作:即捕獲數(shù)據(jù)前像的DELETE語句,和捕獲數(shù)據(jù)后像的INSERT語句。當(dāng)在定義有觸發(fā)器的表上執(zhí)行UPDATE語句時,原始行(前像)被移入到deleted表,更新行(后像)被移入到inserted表。
例如:在course表上創(chuàng)建一個觸發(fā)器trigger_update,當(dāng)更新course表中某門課程的記錄信息時,score表中與該課程相關(guān)的信息也自動被更新。
Use Studentinfo
go
if exists (select name from sysobjects
where name='trigger_update' and type='tr')
drop trigger trigger_update
go
create trigger trigger_update
on course
for update
as
update score
set cno=
(select cno from inserted)
where cno=(select cno from deleted)
go
4 過多的使用觸發(fā)器會給數(shù)據(jù)庫及應(yīng)用程序的維護帶來困難
SQL server觸發(fā)器雖然可以用來保障數(shù)據(jù)的完整性,但我們要有選擇的使用才行,一般情況下,較為簡單的完整性要求,我們通過規(guī)則、約束、默認(rèn)值就可以解決了,就沒有必要使用觸發(fā)器了。而且兩者在運行機制上也是有區(qū)別的,規(guī)則、約束、默認(rèn)值這些是在數(shù)據(jù)更改之前進行數(shù)據(jù)驗證,而觸發(fā)器是在數(shù)據(jù)更改之后才進行驗證的。
如果我們對觸發(fā)器過分的依賴,就會造成遍地是程序的情況,因為觸發(fā)器本身就需要別的程序給它一個觸發(fā)條件,也就是說至少在兩個地方存在著程序,必然影響數(shù)據(jù)庫的結(jié)構(gòu)。
5 結(jié)束語
總之,觸發(fā)器的使用很方便,在保持?jǐn)?shù)據(jù)的完整性操作方面比約束、規(guī)則等具有更加高效的功能,而且也比較簡單。重要的是理解insert、delete、update實現(xiàn)原理及工作過程。雖然觸發(fā)器功能強大,能夠輕松可靠地實現(xiàn)許多復(fù)雜的功能,但要慎用。只有合理的使用觸發(fā)器才會給我們的數(shù)據(jù)庫操作工作帶來很大的便利。
參考文獻:
[1] 楊得鑫.SQL server 2005開發(fā)與應(yīng)用[M].北京:機械工業(yè)出版社.2008.
[2] 李紅.數(shù)據(jù)庫原理與應(yīng)用[M].北京:高等教育出版社.2011.
[3] 李昆.SQL SERVER2005課程設(shè)計案例精編[M].北京:中國水利水電出版社,2010.
[4] 何文華.SQL Server 2005應(yīng)用開發(fā)教程[M].北京:電子工業(yè)出版社,2010.