触发器综述
???????? 對于觸發器,很多人認為不要使用,主要的原因是有觸發器不好控制和觸發器影響性能的說法。但是我認為,觸發器作為大型數據庫的組成部分,并不是只有SQL SERVER才有,它的一些功能是其它方法無法代替的,特別是它作為數據庫約束的補充,所能進行的業務規則的約束,以及在跟蹤和同步所能起的作用。
個人認為,觸發器確實不好控制,這是因為:
一、??????????? 觸發器實現的是在表的操作進行同時,自動進行的操作或者控制,在寫觸發器代碼時必須考慮其特殊性。
二、??????????? 必須限定觸發器影響的記錄,不能擴大。也就是說必須引用INSERTED和DELETED兩個虛表限定操作的范圍。
三、??????????? INSERTED和DELETED的作用域只限定觸發器本身,其調用的存儲過程是不能使用的。
四、??????????? 寫觸發器必須考慮性能,因為其自動性,如果觸發器性能不好是可能拖垮一個系統的。
五、??????????? 必須考慮一次操作多條記錄的情況,除非保證一次只操作一條記錄,一般不能用變量暫存虛表的數據,否則就可能出現在批量操作情況下,觸發器只處理最后一條記錄的情況,這類錯誤可以說是觸發器最常見的錯誤之一。
六、??????????? 必須注意遞歸和嵌套觸發器,因為觸發器往往需要修改其他或者本表數據來實現其功能,這里的修改數據往往能再次觸發觸發器,這時就必須保證其嵌套或者遞歸過程不是無限的,SQL SERVER對觸發器的嵌套層數有最多32的限制。
七、??????????? 觸發器不好調試,比起一般存儲過程,觸發器是在修改數據過程中觸發,調試難度更大。調試過程必須考慮所有情況,比如空表插入數據、已有數據插入新數據、一次插入多行數據、修改一條數據、修改多條數據、一次刪除多條數據、影響0行的修改或者刪除語句等等。
???????? 觸發器不好控制,這就要求我們在決定是否使用觸發器的時候需要非常謹慎,個人認為,對于約束功能,如果可以用其他數據庫方法實現的,比如可以用唯一約束、外鍵約束、規則約束、不可空約束實現的約束,就不要用觸發器,觸發器只用來完成這些方法實現不了的約束。對于可以用觸發器完成的跟蹤、同步功能,則要考慮是否必要,必要的時候才用。而對于其他功能,比如統計功能,則需要與客戶端實現的優劣進行比較。
???????? 對于觸發器影響性能的說法,我不是很同意,因為在觸發器代碼寫得沒有問題的前提下,觸發器所做的工作并不是多余的,這些功能如果不在觸發器完成,就必須在存儲過程或者客戶端用其他代碼實現,所以在系統負擔上基本是一樣的。觸發器唯一比其他方法實現多消耗的是觸發器作為特殊的存儲過程,必須有個被調用的過程,但是由于SQL SERVER有存儲過程的預編譯和過程緩存的機制,這方面的開銷不會很多。相反,在某些情況下,由于觸發器是在記錄更改過程執行的,可以把某些服務器的負載分散到多個時間點去執行,一定程度上均衡服務器負擔,從而提高整體的性能。
???????? 我想通過對觸發器在應用上的分類來說明觸發器如何使用,以及使用過程中需要注意的事項。這里需要說明的是,我的分類并不是從技術以及觸發器類型來分,而是根據觸發起完成的功能來分。(篇幅關系,我把本文分成多個博文,主要的說明和舉例將在各個分類的博文中描述,這里只是簡單的介紹)
???????? 一、約束類觸發器。
?????????????????? 這類觸發器的主要功能是實現不能用主鍵約束、唯一性約束、外鍵約束、CHECK約束、DEFAULT約束、NOT NULL約束來實現的數據庫的完整性和一致性需求,以及其他限制性的業務規則。
???????? 二、日志類觸發器。
?????????????????? 這類觸發器按要求記錄必要的系統運行數據,為程序查錯和業務流程優化提供幫助。
???????? 三、同步類觸發器。
?????????????????? 這類觸發器可以實現不同系統之間的數據同步,也可以實現一些數據的特殊轉換。
???????? 四、統計類觸發器。
?????????????????? 這類觸發器可以實現在數據錄入同時統計必要的數據。
???????? 五、綜合類觸發器。
?????????????????? 綜合類觸發器是以上四類觸發器的綜合,也就是一個觸發器完成上述四類功能的某幾類功能。
?????????????????? 這里不再展開了,舉個簡單的例子,有興趣的可以自己來實現下,在統計類觸發器中,我舉了個庫存統計的例子,如果加多個要求,就是要求進貨表和出貨表的數據變化,不能使得庫存數據產生負數,這樣觸發器代碼中就必須加入約束類觸發器的代碼。
???????? 六、視圖觸發器。
?????????????????? 視圖觸發器有其特殊性,使用視圖觸發器可以更好的完成視圖數據的增刪改。
???????? 七、其他觸發器。
?????????????????? 其他觸發器包括一些其他功能的觸發器,比如2005版本增加的DDL觸發器,DDL觸發器是在執行DDL語句的時候觸發,可以用來做必要的限制和記錄日志,其功能類似于約束類觸發器或者日志類觸發器。2008版本增加的登錄觸發器功能貌似與DDL觸發器類似,還沒有做研究,只順便提一下,錯了莫怪。??????????
?????????????????? 也有一些功能比較特殊的觸發器,很少有這類例子,所以不單獨寫一個博文了,有興趣的可以看看《觸發器和作業結合》,這是之前在論壇遇到的一個特殊例子。
總結
- 上一篇: 学习java 的30个目标
- 下一篇: xp系统中的隐藏文件不能显示 解决方案