□文/朱小娟
(1.安徽國防科技職業學院 安徽·六安;2.電子科技大學數學科學學院 四川·成都)
隨著數據庫技術在各個領域的廣泛應用,保證數據庫完整性和安全性的工作也越來越重要。在SQL Server2005中可以通過約束和觸發器保證數據的完整性、一致性和有效性。約束直接設置于數據表中,可以實現一些簡單的數據完整性操作,而對于一些復雜的完整性操作使用觸發器是最佳的選擇,如自定義錯誤、數據的跟蹤等。
觸發器是一種特殊的存儲過程,其特殊性在于它的執行不需要用戶手動調用,而是當在觸發表或觸發視圖上運行某些事件時自動被激活執行。在SQL Server2005中,根據觸發事件不同分為DML觸發器和DDL觸發器兩類。
1、DML觸發器。DML觸發器是在數據庫中發生數據操作語言(DML)事件時被自動執行。根據觸發器語句執行的時機,DML觸發器分為AFTER觸發器和INSTEAD OF觸發器。AFTER觸發器先執行 INSERT、UPDATE或DELETE操作,之后執行觸發器語句;INSTEAD OF觸發器在 INSERT、UPDATE或DELETE語句運行時使用觸發器語句代替。
2、DDL觸發器。DDL觸發器是SQL Server2005的新增功能,當服務器或數據庫中發生數據定義語言(DDL)事件時將自動執行該觸發器,一般用于執行數據庫中的管理任務。
當DML觸發器執行時,會產生兩個存儲在服務器內存中的特殊表:inserted表和deleted表。執行INSERT事件時產生inserted表,用來保存插入記錄的副本;執行DELETE事件時產生deleted表,用來保存刪除記錄的副本;執行UPDATE事件時兩個表都產生,deleted表保存更新前記錄的副本,inserted表保存更新后記錄的副本。這兩張表都是臨時表,只有當觸發器運行時存在,運行完自動刪除。用戶可以使用這兩張表獲取插入和刪除的記錄信息,但不能對其進行修改。
下面以“高校工資管理系統”為例介紹觸發器在保證數據的完整性、自定義錯誤信息、數據跟蹤方面的應用。“高校工資管理系統”中主要包含TblTeacher表和TblSalary表,表結構(在此只列出了表的主要字段)如表1、表2所示。(表 1、表 2)

表1 Tbl Teacher表結構

表2 Tbl sal ary表結構
1、保證數據完整性和一致性
任務:在高校中,教師的崗位工資由職稱決定。當教師的職稱修改時,該教師的崗位工資應該修改為其職稱對應的崗位工資,以保證數據的一致性。
分析:此任務涉及到兩個表中的字段,使用約束無法實現。我們可以在TblTeacher表中建立一個更新觸發器,當Title(職稱)列被更新時,對應職工的BasicSalary(崗位工資)值被一起更新。其中,初級對應的BasicSalary為1000,中級 1200,高級 1400,其他 800。
我們可以在TblTeacher表上創建以下觸發器:

2、自定義錯誤信息
任務:教師的崗位工資字段值要求只能是1000、1200、1400、800。我們可以為 BasicSalary字段添加CHECK約束來強制用戶只能輸入1000、1200、1400、800。這樣,當我們輸入的值超出這個范圍時,系統就會給出如下提示:
消息547,級別16,狀態0,第1行
UPDATE語句與CHECK約束"ck_bs"沖突發生于數據庫"TEST",表"dbo.Tblsalary",column'BasicSalary'。
語句已終止。
該提示是系統給出,用戶較難理解。現希望能在發生錯誤時,給出一個用戶自定義、交互性好的提示。
分析:我們可以在TblSalary表上創建一個觸發器,當表上執行插入和更新語句時檢查輸入值是否正確,不正確給出自定義的提示。
在TblSalary表上創建以下觸發器:

END創建完觸發器,再輸入正確數據時,就會顯示如下提示:
消息 5000,級別 16,狀態 10,Tri_Upd_Basic-Salary,第 10 行
你輸入的值只能是 1000、1200、1400、800,請重輸!
3、數據跟蹤
任務:Tblsalary表中數據是很重要的,為了幫助管理員掌握BasicSalary表數據的修改情況,我們希望記錄下Tblsalary表中數據的修改情況。現要求當Tblsalary表中數據被被修改時,將修改的用戶、修改的時間等信息記錄下來保存在TblLogInfo表中。(表3)

表3 Tbl LogInfo表結構圖
下面我們以Tblsalary表中OverSalary列修改情況記錄為例介紹觸發器的創建:


本文以“高校工資管理系統”為例,介紹了觸發器在完整性設置、自定義錯誤、數據跟蹤方面的應用,其實觸發器的應用還有很多,如數據的級聯刪除和級聯更新等。觸發器可以實現一些復雜的完整性約束,但在數據庫設計的過程中過多的使用觸發器會導致數據庫系統維護困難,因此在數據庫系統的開發過程中應結合約束、規則、存儲過程合理地使用觸發器。
[1]黃存東.數據庫原理及應用.中國水利水電出版社,2011.
[2]鄧友林.SQ L Server 2005中用觸發器實現數據庫的數據完整性研究.湖南工業職業技術學院學報,2011.11.4.
[3]徐友武.SQ L Server 2005觸發器應用研究.計算機與信息.