□文/朱小娟
(1.安徽國防科技職業(yè)學(xué)院 安徽·六安;2.電子科技大學(xué)數(shù)學(xué)科學(xué)學(xué)院 四川·成都)
隨著數(shù)據(jù)庫技術(shù)在各個領(lǐng)域的廣泛應(yīng)用,保證數(shù)據(jù)庫完整性和安全性的工作也越來越重要。在SQL Server2005中可以通過約束和觸發(fā)器保證數(shù)據(jù)的完整性、一致性和有效性。約束直接設(shè)置于數(shù)據(jù)表中,可以實(shí)現(xiàn)一些簡單的數(shù)據(jù)完整性操作,而對于一些復(fù)雜的完整性操作使用觸發(fā)器是最佳的選擇,如自定義錯誤、數(shù)據(jù)的跟蹤等。
觸發(fā)器是一種特殊的存儲過程,其特殊性在于它的執(zhí)行不需要用戶手動調(diào)用,而是當(dāng)在觸發(fā)表或觸發(fā)視圖上運(yùn)行某些事件時自動被激活執(zhí)行。在SQL Server2005中,根據(jù)觸發(fā)事件不同分為DML觸發(fā)器和DDL觸發(fā)器兩類。
1、DML觸發(fā)器。DML觸發(fā)器是在數(shù)據(jù)庫中發(fā)生數(shù)據(jù)操作語言(DML)事件時被自動執(zhí)行。根據(jù)觸發(fā)器語句執(zhí)行的時機(jī),DML觸發(fā)器分為AFTER觸發(fā)器和INSTEAD OF觸發(fā)器。AFTER觸發(fā)器先執(zhí)行 INSERT、UPDATE或DELETE操作,之后執(zhí)行觸發(fā)器語句;INSTEAD OF觸發(fā)器在 INSERT、UPDATE或DELETE語句運(yùn)行時使用觸發(fā)器語句代替。
2、DDL觸發(fā)器。DDL觸發(fā)器是SQL Server2005的新增功能,當(dāng)服務(wù)器或數(shù)據(jù)庫中發(fā)生數(shù)據(jù)定義語言(DDL)事件時將自動執(zhí)行該觸發(fā)器,一般用于執(zhí)行數(shù)據(jù)庫中的管理任務(wù)。
當(dāng)DML觸發(fā)器執(zhí)行時,會產(chǎn)生兩個存儲在服務(wù)器內(nèi)存中的特殊表:inserted表和deleted表。執(zhí)行INSERT事件時產(chǎn)生inserted表,用來保存插入記錄的副本;執(zhí)行DELETE事件時產(chǎn)生deleted表,用來保存刪除記錄的副本;執(zhí)行UPDATE事件時兩個表都產(chǎn)生,deleted表保存更新前記錄的副本,inserted表保存更新后記錄的副本。這兩張表都是臨時表,只有當(dāng)觸發(fā)器運(yùn)行時存在,運(yùn)行完自動刪除。用戶可以使用這兩張表獲取插入和刪除的記錄信息,但不能對其進(jìn)行修改。
下面以“高校工資管理系統(tǒng)”為例介紹觸發(fā)器在保證數(shù)據(jù)的完整性、自定義錯誤信息、數(shù)據(jù)跟蹤方面的應(yīng)用。“高校工資管理系統(tǒng)”中主要包含TblTeacher表和TblSalary表,表結(jié)構(gòu)(在此只列出了表的主要字段)如表1、表2所示。(表 1、表 2)
表1 Tbl Teacher表結(jié)構(gòu)
表2 Tbl sal ary表結(jié)構(gòu)
1、保證數(shù)據(jù)完整性和一致性
任務(wù):在高校中,教師的崗位工資由職稱決定。當(dāng)教師的職稱修改時,該教師的崗位工資應(yīng)該修改為其職稱對應(yīng)的崗位工資,以保證數(shù)據(jù)的一致性。
分析:此任務(wù)涉及到兩個表中的字段,使用約束無法實(shí)現(xiàn)。我們可以在TblTeacher表中建立一個更新觸發(fā)器,當(dāng)Title(職稱)列被更新時,對應(yīng)職工的BasicSalary(崗位工資)值被一起更新。其中,初級對應(yīng)的BasicSalary為1000,中級 1200,高級 1400,其他 800。
我們可以在TblTeacher表上創(chuàng)建以下觸發(fā)器:
2、自定義錯誤信息
任務(wù):教師的崗位工資字段值要求只能是1000、1200、1400、800。我們可以為 BasicSalary字段添加CHECK約束來強(qiáng)制用戶只能輸入1000、1200、1400、800。這樣,當(dāng)我們輸入的值超出這個范圍時,系統(tǒng)就會給出如下提示:
消息547,級別16,狀態(tài)0,第1行
UPDATE語句與CHECK約束"ck_bs"沖突發(fā)生于數(shù)據(jù)庫"TEST",表"dbo.Tblsalary",column'BasicSalary'。
語句已終止。
該提示是系統(tǒng)給出,用戶較難理解。現(xiàn)希望能在發(fā)生錯誤時,給出一個用戶自定義、交互性好的提示。
分析:我們可以在TblSalary表上創(chuàng)建一個觸發(fā)器,當(dāng)表上執(zhí)行插入和更新語句時檢查輸入值是否正確,不正確給出自定義的提示。
在TblSalary表上創(chuàng)建以下觸發(fā)器:
END創(chuàng)建完觸發(fā)器,再輸入正確數(shù)據(jù)時,就會顯示如下提示:
消息 5000,級別 16,狀態(tài) 10,Tri_Upd_Basic-Salary,第 10 行
你輸入的值只能是 1000、1200、1400、800,請重輸!
3、數(shù)據(jù)跟蹤
任務(wù):Tblsalary表中數(shù)據(jù)是很重要的,為了幫助管理員掌握BasicSalary表數(shù)據(jù)的修改情況,我們希望記錄下Tblsalary表中數(shù)據(jù)的修改情況。現(xiàn)要求當(dāng)Tblsalary表中數(shù)據(jù)被被修改時,將修改的用戶、修改的時間等信息記錄下來保存在TblLogInfo表中。(表3)
表3 Tbl LogInfo表結(jié)構(gòu)圖
下面我們以Tblsalary表中OverSalary列修改情況記錄為例介紹觸發(fā)器的創(chuàng)建:
本文以“高校工資管理系統(tǒng)”為例,介紹了觸發(fā)器在完整性設(shè)置、自定義錯誤、數(shù)據(jù)跟蹤方面的應(yīng)用,其實(shí)觸發(fā)器的應(yīng)用還有很多,如數(shù)據(jù)的級聯(lián)刪除和級聯(lián)更新等。觸發(fā)器可以實(shí)現(xiàn)一些復(fù)雜的完整性約束,但在數(shù)據(jù)庫設(shè)計的過程中過多的使用觸發(fā)器會導(dǎo)致數(shù)據(jù)庫系統(tǒng)維護(hù)困難,因此在數(shù)據(jù)庫系統(tǒng)的開發(fā)過程中應(yīng)結(jié)合約束、規(guī)則、存儲過程合理地使用觸發(fā)器。
[1]黃存東.數(shù)據(jù)庫原理及應(yīng)用.中國水利水電出版社,2011.
[2]鄧友林.SQ L Server 2005中用觸發(fā)器實(shí)現(xiàn)數(shù)據(jù)庫的數(shù)據(jù)完整性研究.湖南工業(yè)職業(yè)技術(shù)學(xué)院學(xué)報,2011.11.4.
[3]徐友武.SQ L Server 2005觸發(fā)器應(yīng)用研究.計算機(jī)與信息.