姚瑾如
摘要:觸發(fā)器作為一種高效、快捷的數(shù)據(jù)庫技術(shù),被廣泛應(yīng)用到基于B/S結(jié)構(gòu)的網(wǎng)絡(luò)應(yīng)用軟件的開發(fā)中。文章介紹數(shù)據(jù)庫觸發(fā)器技術(shù)的概念、原理,并采集目前觸發(fā)器在高校信息管理系統(tǒng)中的應(yīng)用,以及在開發(fā)過程中使用觸發(fā)器所遇到的問題,找出解決問題的方法和今后在使用中應(yīng)當(dāng)注意的事項。
關(guān)鍵詞:觸發(fā)器;數(shù)據(jù)庫;高校信息系統(tǒng)
中圖分類號:TP311 文獻標(biāo)識碼:A 文章編號:1009-3044(2012)34-8114-03
廣泛的信息共享需求使得數(shù)據(jù)庫技術(shù)和Web技術(shù)的結(jié)合日趨緊密。數(shù)據(jù)庫觸發(fā)器技術(shù)以其高效、快捷的特點,在實踐中被廣泛使用。該文主要介紹觸發(fā)器技術(shù)在高校信息管理系統(tǒng)中的應(yīng)用,舉例在使用中產(chǎn)生的問題及其采用的解決方法,初步探討如何正確使用觸發(fā)器。
1觸發(fā)器技術(shù)概述
1.1觸發(fā)器概念
存儲過程(StoredProcedure)是在大型數(shù)據(jù)庫系統(tǒng)中,將為了實現(xiàn)特定任務(wù)而需要多次調(diào)用的代碼段編寫成一組SQL語句集,經(jīng)編譯后存儲在數(shù)據(jù)庫中,用戶通過指定存儲過程的名字并給出參數(shù)(如果該存儲過程帶有參數(shù))來調(diào)用執(zhí)行它。
觸發(fā)器是建立在表上的特殊的存儲過程,它與存儲過程的區(qū)別在于,它的執(zhí)行不是由程序調(diào)用,也不是手工啟動,而是由事件來觸發(fā),比如當(dāng)對一個表進行操作(insert,delete,update)時就會激活它執(zhí)行。觸發(fā)器雖然是基于一個表而創(chuàng)建的,卻可以實現(xiàn)數(shù)據(jù)庫中相關(guān)表之間的級聯(lián)修改和自動更新。經(jīng)常用于加強數(shù)據(jù)的完整性約束和業(yè)務(wù)規(guī)則等。
在SQLServer2005中,根據(jù)SQL語句的不同,觸發(fā)器可分為DML觸發(fā)器和DDL觸發(fā)器【1】。其中,DML觸發(fā)器是當(dāng)數(shù)據(jù)庫服務(wù)器中發(fā)生數(shù)據(jù)操縱事件時執(zhí)行的存儲過程,DML事件包括在指定表或視圖中修改數(shù)據(jù)的INSERT語句、UPDATE語句或DELETE語句。DDL觸發(fā)器是在響應(yīng)數(shù)據(jù)定義事件時執(zhí)行的存儲過程,主要包括CREATE、ALTER、DROP語句,用于執(zhí)行數(shù)據(jù)庫中的管理任務(wù)【2】。
高校信息管理系統(tǒng)主要采用DML觸發(fā)器實現(xiàn)數(shù)據(jù)的完整性。
1.2DML觸發(fā)器的工作原理
在SQLServer2005里,觸發(fā)器觸發(fā)時,系統(tǒng)自動在內(nèi)存中創(chuàng)建兩個特殊的邏輯表:插入表和刪除表。它們的結(jié)構(gòu)和觸發(fā)器所在數(shù)據(jù)表的結(jié)構(gòu)完全一致,但它們只是建立在數(shù)據(jù)服務(wù)器中的邏輯表,而不是真正存儲在數(shù)據(jù)庫中的物理表,只能讀取,不能修改。當(dāng)觸發(fā)器工作完成時,這兩個表也被從內(nèi)存中刪除【2】。
插入表里存放的是更新前的記錄:對于插入記錄操作來說,插入表里存放的是要插入的數(shù)據(jù);對于更新記錄操作來說,插入表里存放的是要更新的記錄。
刪除表里存放的是更新后的記錄:對于更新記錄操作來說,刪除表里存放的是更新前的記錄(更新完后即被刪除);對于刪除記錄操作來說,刪除表里存入的是被刪除的舊記錄。如表1所示:
1.3觸發(fā)器的優(yōu)點
1)效率高 觸發(fā)器被提前編譯,且使用高速緩存,減少服務(wù)器和客戶端之間的數(shù)據(jù)交換,故加快了執(zhí)行速度,提高了運行效率。
2)節(jié)約資源 使用觸發(fā)器集中存放經(jīng)常用到的操作,能簡化客戶端編程,減少網(wǎng)絡(luò)開銷,提高開發(fā)效率。
3)修改方便 當(dāng)服務(wù)器端數(shù)據(jù)或者業(yè)務(wù)邏輯發(fā)生變化時,只需簡單地修改觸發(fā)器的SQL語句,而不必更改應(yīng)用程序。
4)使用觸發(fā)器方便維護數(shù)據(jù)的完整性,保證數(shù)據(jù)的有效性和安全性。
2 觸發(fā)器在高校信息管理系統(tǒng)中的應(yīng)用
在高校信息管理系統(tǒng)中,應(yīng)用的觸發(fā)器主要是DML觸發(fā)器,用以實現(xiàn)以下功能:
2.1自動給表中的字段賦值
例如,在高校管理信息系統(tǒng)中,在系統(tǒng)中錄入一條專利成果信息時,利用觸發(fā)器將系統(tǒng)時間自動賦值給專利信息表里的操作時間字段,用以記錄產(chǎn)生的時間。觸發(fā)器程序如下:
2.2級聯(lián)刪除相關(guān)表,保持?jǐn)?shù)據(jù)完整性
通常有一些表之間是存在相關(guān)聯(lián)系的,維護一張表的同時也要維護相關(guān)聯(lián)的表。例如在高校信息系統(tǒng)中,專利成果信息表和專利成員表是相關(guān)聯(lián)的,專利信息表中的每一條數(shù)據(jù)都有相對應(yīng)的成員信息,如果專利信息表中的數(shù)據(jù)被刪除,則這條數(shù)據(jù)對應(yīng)的相關(guān)成員表也應(yīng)該同時被刪除。這樣既能減少系統(tǒng)中的冗余數(shù)據(jù),又能保持?jǐn)?shù)據(jù)完整性。觸發(fā)器程序舉例如下:
2.3同步修改相關(guān)表字段,保持信息完整性一致
觸發(fā)器用于更新相關(guān)表字段的情況在高校信息管理系統(tǒng)中也同樣存在。例如,一個項目申請結(jié)題被批準(zhǔn)后,要同步更新項目基本信息中的結(jié)題狀態(tài)字段,以保持項目信息的完整性一致,觸發(fā)器程序如下:
2.4將表中數(shù)據(jù)自動轉(zhuǎn)存,減少重復(fù)工作量
在信息系統(tǒng)中經(jīng)常會遇到這樣的情況,一條數(shù)據(jù)通過相關(guān)審核之后要轉(zhuǎn)入到同一系統(tǒng)中的另外一張表,或者與之相接口的另外一個系統(tǒng)的一張表中,進行其他數(shù)據(jù)操作。這時,使用觸發(fā)器,在操作表的某個狀態(tài)下觸發(fā),自動將相關(guān)數(shù)據(jù)轉(zhuǎn)存到另外一張表中,就能夠減少工作量,提高效率;并且數(shù)據(jù)中的字段越多時,這種便捷越明顯。例如,在高校信息系統(tǒng)中,一個科研基地建設(shè)申請審核通過,批準(zhǔn)結(jié)論為“批準(zhǔn)建設(shè)”時,將基地在申請時填寫的信息自動轉(zhuǎn)存到基地基本信息表里面,用于以后維護。觸發(fā)器程序如下:
3應(yīng)用中的問題及解決
觸發(fā)器的便捷,使得在開發(fā)過程中,一旦遇到操作數(shù)據(jù)問題時總想通過觸發(fā)器的方式解決,但是觸發(fā)器有時會產(chǎn)生無法預(yù)料的錯誤。在高校信息系統(tǒng)開發(fā)過程中,筆者也遇到過觸發(fā)器導(dǎo)致的無法預(yù)料的錯誤。
在高校信息系統(tǒng)中,項目管理模塊用來對高校老師參與的科研項目信息進行登記、審核、維護。由于科研項目數(shù)目很多,并且關(guān)聯(lián)到科研經(jīng)費分配和職稱評審等重要方面,學(xué)校要求給每個項目生成一個有特定規(guī)則的項目編號,方面項目的管理。
面對這樣一個問題,我們首先想到的是利用觸發(fā)器,在項目登記審核通過時觸發(fā),數(shù)據(jù)庫根據(jù)寫好的規(guī)則生成項目編碼,將項目編碼存儲到項目基本信息表中。思路清晰,且很好實現(xiàn)。
該功能開發(fā)完成測試時,觸發(fā)器能夠正常生成項目編碼,交付學(xué)校使用一段時間后,現(xiàn)場實施人員發(fā)現(xiàn)項目編碼會出現(xiàn)跳號問題,并且是不定時偶然發(fā)生。仔細(xì)研究這個問題之后,我們發(fā)現(xiàn)使用這個觸發(fā)器時,我們?yōu)榱藢τ|發(fā)器本表進行了查詢和更新,在觸發(fā)器中加入了pragmaautonomous_transaction(自治事務(wù)),正是自治事務(wù)的引入,使得觸發(fā)器在生成項目編號時產(chǎn)生了無法預(yù)料的錯誤。
由于項目編號的生成無可避免的需要查詢和更新本表,為了解決該問題,我們放棄使用觸發(fā)器,改為在程序js代碼中callservice,直接在jsp頁面中操作數(shù)據(jù)庫,生成項目編碼,插入項目表中。對比觸發(fā)器的實現(xiàn)方式,后者明顯增加了代碼量,但是安全性更高,也從根本上避免了自治事務(wù)引入產(chǎn)生的無法預(yù)料錯誤。為了系統(tǒng)更高的安全性,犧牲一些硬件資源是非常合理和值得的。
4結(jié)束語
觸發(fā)器雖然方便、快捷,但是它也有很多缺點。
首先,觸發(fā)器容易被忽視。由于觸發(fā)器是寫在數(shù)據(jù)庫里面的,并且一次編譯之后就能直接觸發(fā)使用,在程序中沒有調(diào)用語句,因此不利于長期的系統(tǒng)維護。
其次,觸發(fā)器使用安全性較低。在日常的開發(fā)中,我們的代碼是和配置庫關(guān)聯(lián)的,修改前要簽出,修改后要簽入,使用前要更新代碼,修改還可以撤銷,配置庫上也會保留歷史修改版本,這樣保證了代碼的一致性和修改不會丟失,也方便維護。但是我們修改觸發(fā)器時,只能先備份到本地,每次修改都要備份,時間久了以前修改的備份還會丟失,不利于維護和代碼的安全性。
再有,觸發(fā)器還會產(chǎn)生難以預(yù)料的錯誤;在觸發(fā)器中,查詢和更新本表是被禁止的,但是很多時候都要查詢、更新本表,所以我們引入“自治事務(wù)”來實現(xiàn)查詢、更新本表的功能,但在使用過程中卻會產(chǎn)生無法預(yù)料的錯誤。
相比而言,存儲過程就要穩(wěn)定和安全很多。存儲過程在程序中有調(diào)用接口,開發(fā)人員在日后維護系統(tǒng)時就能夠明確的知道什么地方采用了存儲過程。和觸發(fā)器相類似,存儲過程也能夠節(jié)約很多系統(tǒng)資源。業(yè)務(wù)邏輯變化時也能夠在不大量修改代碼的情況下,只修改自身的方法規(guī)則,就能快速的響應(yīng)需求變化。所以在高校信息系統(tǒng)中,我們很多時候可以用存儲過程來代替觸發(fā)器,實現(xiàn)很多數(shù)據(jù)操作。
參考文獻:
[1]劉智勇.SQLserver2005寶典[M].北京:電子工業(yè)出版社,2007.
[2]肖海蓉.觸發(fā)器技術(shù)在數(shù)據(jù)庫系統(tǒng)開發(fā)中的應(yīng)用研究[J].電腦開發(fā)與應(yīng)用,2011,24(7):36-38.
[3]鄭阿奇.SQLserver2008應(yīng)用實踐教程[M].北京:電子工業(yè)出版社,2010.