蔡朝暉,劉 春
(大慶師范學院 計算機科學與信息技術學院,黑龍江 大慶 163712)
本文中提到的實驗管理系統(以下簡稱為實驗系統),是作者在研項目《軟件工程專業理論課程實驗管理網絡化研究與實現》中實驗管理系統應用軟件的設計開發和實現部分。
在實驗系統的設計和實現過程中,應用DML觸發器完成了數據參照完整性實現以及自動更新等功能的實現。完成本文的主要目的:研究、分析、總結應用觸發器機制的優勢及使用注意事項;同時研究分析了數據庫系統中觸發器機制的潛在應用。
觸發器是數據庫服務器中發生事件時自動執行的特殊存儲過程。它與存儲過程經歷的過程類似,但不同的是觸發器沒有接口,不能被顯示調用,只有當某一事件發生時由數據庫服務自動執行[1],而我們主要用到的正是它自動執行的優勢特性。
一般的DBMS,提供的觸發器機制基本都包括DML觸發器和DDL觸發器兩種。如果要通過數據操縱語言(DML)事件修改數據,則執行DML觸發器。DML事件是指對表或視圖的INSERT、UPDATE或DELETE這三種更新操作。我們在實驗系統中使用的DML事件觸發器,是針對學生實驗管理表的INSERT語句、學生實驗成績表的UPDATE語句、系統用戶登錄表的DELETE語句而設計觸發的。
觸發器常用于強制業務規則和數據完整性。數據庫系統一般提供兩種機制來實現業務規則和數據完整性:約束和觸發器。完整性約束機制在檢測出違反約束條件的操作后,只能做簡單的動作;觸發器則可以通過用戶使用編程的方法實現復雜的業務規則。在觸發器的使用中,應當記住的一個原則是,如果能夠通過約束實現數據完整性,那么就使用約束實現。如果無法通過約束實現數據完整性,嘗試使用存儲過程能否實現,讓存儲過程在確定更新之前先執行檢查。只有在這些方法都無法實現數據完整性時才使用觸發器。
每個新學期開學時都應導入新的實驗用戶數據至實驗系統中,這些導入的數據主要是本學期上課學生及任課教師的相關數據,這些數據要同時存儲到學生實驗成績管理表和系統用戶登錄表中。
我們希望在DBA將學生數據信息導入至實驗成績管理表中時,同時實現關于學生用戶的信息導入至系統用戶登錄表中。因為每學期參與完成實驗的學生必定是系統用戶,而學生信息數據相對于教師信息數據的錄入工作量至少是幾百倍。
學生完成實驗后提交的實驗總結,由教師用來做為評價學生實驗情況的依據,教師打分完成后,學生就不再具有此實驗的使用權限,此時的數據我們希望備份至另附的表中存儲。
隨著每個學期課程的結束,其相關實驗對于本年級開課學生來說也結束了,那么在實驗管理系統中,學生成績上報完成后,實驗系統中就可以不必直接管理這些學生的相關信息了,同時登錄用戶中也應及時刪除這些學生的信息。
1)級聯插入功能觸發器
create trigger tri_stu_insert
on 學生表
for insert
begin
insert into 登錄表 values(id,name) as select sno,sname from inserted;
end
//代碼說明:其中用到的字段名sno、sname分別為學生學號和學生姓名,登錄表中學生用戶初始密碼默認為“000000”。
2)自動備份功能觸發器
create trigger tri_stug_update
on 學生成績表
for update
begin
if exists
(select * from 備份_學生成績表 where sno=inserted.sno)
update備份_學生成績表 set grade=inserted.grade
else
insert into 備份_學生成績表as select * from inserted;
end
//代碼說明:備份_學生成績表為先前創建好的與學生成績表完全同構的成績備份表。
//代碼說明:update語句分為兩步操作:即捕獲數據前像的delete語句和捕獲數據后像的insert語句。當在定義有觸發器的表上執行update語句時,原始行(前像)被移入到deleted表,更新行(后像)被移入到inserted表。
//另注:此觸發器的使用權限只授權給教師用戶。
3)級聯刪除功能觸發器
create table 學生成績表
(
sno char(12),
cno char(8),
pno char(10),
pwork varchar(1000),
grade float default 0,
primary key(sno,pno),
foreign key(sno) references student(sno),
foreign key(pno) references pra(pno)
on delete cascade
);
//代碼說明:這里在創建學生成績表時使用了外碼約束,同時直接使用了級聯刪除機制。由于其實質是系統觸發器,所以總結在此。
我們在系統中用到的級聯刪除功能,直接體現了觸發器最常用的功能,即實現數據完整性之參照完整性;對于在實驗系統中用到的自動備份功能觸發器和級聯插入功能觸發器,我們意在使用它的主動功能,提高數據錄入效率。
盡管級聯插入觸發器執行時系統開銷會比較大,但綜合考慮觸發器執行頻率和數據插入操作頻率的對比,設計并使用了該觸發器;對于自動備份功能觸發器,其在每修改一行學生成績時會備份其所在行至學生成績表中,在此使用的是觸發器的級聯修改機制,只需針對是初始修改還是非初始修改設計即可。對于可能在使用級聯更新觸發器時產生的更新鏈循環問題,從設計上給予重視是可以避免的。
許多人將代碼重構視為軟件開發的一個基本組成部分,而應用開發的一個很大部分是與數據庫打交道,重構數據庫會引入一些新的問題,所以數據庫是重構的一個主要問題領域。做為一個具有完整功能的應用軟件,實驗系統也不例外,所以在此我們也設計了在實驗系統的數據庫重構時使用觸發器。
4.1.1 理論依據
數據庫重構是對數據庫模式的一個簡單變更,在保持其行為語義和信息語義的同時改進它的設計。而數據庫模式既包括結構的方面,也包括功能的方面。所以數據庫重構在概念上比代碼重構更困難,因為代碼重構只需要保持行為語義;另外,由于數據庫架構所導致的耦合度,數據庫重構會變得更加復雜。[4]
尤其是當有多個外部程序與數據庫交互時,一些程序可能在你的控制范圍之外。這種情況下,數據庫重構會需要一個比較長的轉換期,在這個期間,不可能依靠一個應用同時更新兩個模式中的表(新、舊模式中的同一個表),所以需要一種像觸發器這樣的機制來保持它們的值同步,以確保不論應用訪問哪一個版本的模式,都能訪問到一致的數據。在轉換期之后,需要刪除重構前的舊值(列/表)和觸發器,當然,要在足夠的測試可以確保安全時,才能刪除它們。
4.1.2 重構策略中同步方法對比分析[4]
根據經驗,在數據庫重構策略中,觸發器在絕大多數情況下都是最好的保證新舊模式同步的方法。觸發器優于視圖或批量同步,具體參見表1所示:

表1 模式同步策略
4.2.1 理論依據
目前,已經有些商用數據庫系統加入了主動機制,即能主動地向用戶提供服務,通常稱其為主動數據庫。它是數據庫與人工智能技術相結合的產物,它可以根據應用系統的當前狀況,主動適時地做出反應,執行某些操作向用戶提供相關信息[1]。主動數據庫的核心是規則的概念,而這些規則的初級模型就是觸發器,當然,主動規則絕不是觸發器設計與使用的簡單堆砌。
主動規則由事件、條件、動作組成,記為ECA。規則的基本動作方式是,一旦系統檢測到相應規則事件發生,就在特定時刻檢查規則的條件,若條件滿足,則執行相應的動作。[3,6]
4.2.2 實驗有效期監控
在實驗系統的實驗管理功能中,我們要求按每個實驗的有效期來設置權限。即當一個實驗布置給學生后的一定時間內,要求學生完成實驗并提交實驗總結,一旦過了這個時間期限,就將此實驗的學生用戶權限修改為只讀(我們這里采用取消學生所做提交操作)。
通常這個功能由DBA來定期手工完成,哪怕他只是調用存儲過程。但如果將這個操作交由主動規則來做,情況就不同了:即我們對實驗加一個計時器,用來累計實驗布置的天數,實驗被學生使用時主動規則被觸發,如果這個天數離規定期限還有2天,提醒學生,如果達到期限,則執行規則定義的動作——取消學生的上傳實驗總結操作。
另外,與提醒學生實驗有效期一樣,也可以設計一個規則用來監控學生實驗成績,即設定一個閥值,如果學生的成績低于這個閥值,便會向教師發出警示信息。
在數據庫觸發器機制的基本應用中,觸發器的作用通常主要是用于實現數據完整性,觸發器比約束更加靈活,可以實現復雜的數據完整性,另外觸發器還可以實現審核更改等更多的功能。僅就實現數據完整性方面,應綜合考慮功能和性能開銷來決定使用何種數據完整性的方法。約束比較簡單,開銷低,適用于完整性邏輯比較簡單的場合。觸發器執行速度快,所引用的表和所影響的行的數目決定了觸發器的執行時間,觸發器的系統開銷很大,在使用觸發器之前應該首先考慮使用約束。[1]
慎用級聯更新觸發器機制,要注意其潛伏著的復雜問題,因為過長的更新鏈可能降低系統速度,更復雜的問題是這個鏈構成的自身循環。SQL標準禁止觸發器循環,即系統會監視整個更新鏈,如果遇到循環,取消修改并發出警告。盡管如此,設計者仍然需要避免問題發生,因為不管這類循環收斂還是發散,都會消耗大量資源。使用觸發器實現數據庫重構的模式同步,以及實驗有效期的實時監控等應用,為區別于觸發器的直接基本應用,本文將它們歸結為潛在應用。也因為這些應用的完成相對比較復雜,更多的涉及到數據庫架構耦合度、主動規則終止性分析等復雜問題的研究,究其實質,這些問題主要癥結也是源于觸發器循環的問題。至于更多的觸發器潛在應用,比如基于語義分析的查詢優化等,希望在接下來的觸發器機制應用中有更深入的研究。
[參考文獻]
[1] 周志逵,郭貴鎖.數據庫系統原理[M].北京: 人民郵電出版社, 2008: 148-157, 295-303 , 391-395.
[2] Ramez Elmasri , Shamkant B. Navathe.數據庫系統基礎:初級篇[M].北京: 清華大學出版社, 2008: 186-187.
[3] Ramez Elmasri , Shamkant B. Navathe.數據庫系統基礎:高級篇[M].北京: 清華大學出版社, 2008: 145-152.
[4] Scott W. Ambler , Pramod J. Sadalage[M].數據庫重構. 北京: 機械工業出版社, 2007: 10-27 , 39-40 .
[5] Gerald V. Post.數據庫管理系統[M]. 北京: 機械工業出版社, 2006: 228-232 .
[6] 郝忠孝.主動數據庫系統理論基礎[M]. 北京: 科學出版社, 2009: 2-18.