對觸發器一詞早有耳聞(最早是在耿大媽的資料庫視頻中),當初看完視頻後,對理解不深刻的東西如:觸發器,預存程序,事務,日誌等等沒有詳細的去查閱,也沒有具體的去嘗試,應用。所以才導致了今天的部落格(把以前丟下的補上)。提到觸發器一詞,首先想到的是“觸發器不能亂用”,“慎用觸發器”,不過我們可不能把這些提醒的話,當成了自己不去嘗試的借口。學習要有無知者無畏的精神,管他呢,先試了再說。
簡單介紹
- 概念:觸發器是個特殊的預存程序(預存程序下篇部落格中會講到),它的執行不是由程式調用,也不是手工啟動,而是由事件來觸發,比如當對一個表進行操作(insert,delete, update)時就會啟用它執行。觸發器經常用於加強資料的完整性條件約束和商務規則等。
- 作用:主要作用就是能夠實現由主外鍵所不能保證的,複雜的參照完整性和資料的一致性。另外觸發器還可以通過資料庫中的相關表實現級聯更改,通貨級聯參考完整性約束可以更有效執行這些更改。其次還有強化約束,跟蹤變化,預存程序的調用等。當然還有其他很多的功能,只是現在尚未接觸到而已,詳細的內容請查看百科觸發器 。
如何使用
比起上面的基礎知識,相信大家更關注的是具體怎麼使用。下面以機房收費系統系統中的一個充值功能為例來說明觸發器在系統中的具體應用。
- 首先想,想想在充值這個功能中哪個地方用到了觸發器?在充值完成後會儲存一條記錄到充值記錄表中,這條記錄中包含最新的餘額,同時還要把這個餘額更新到卡表中。即在執行insert操作的時候,觸發條件去執行一個Update操作。
- 在SQL相應表中建立觸發器。這個操作是在充值記錄表中完成的,所以觸發器建立在該表中。詳見:
- 添加相應觸發器的代碼:
-- =============================================-- Author:牛遷遷-- Create date: 06/09/2014 15:32:21-- Description:當插入一條儲值記錄時,自動更新卡表中的餘額-- =============================================ALTER TRIGGER [dbo].[CardBalance] -- 觸發器名稱 ON [dbo].[Recharge_info] -- 觸發器位置 FOR insert -- 表明期望觸發器在何種動作類型下啟用 AS declare @Balance varchar(8) --declare @CID varchar(8) -- 聲明參數select @Balance = balance from Recharge_info -- 給參數賦值select @CID = CID from Recharge_info --BEGIN -- 執行觸發器,更新卡表餘額UPDATE Card_info set balance = @Balance where Card_info .CID = @CID END
- 運行結果查看:
充值記錄表:
卡表:
慎用觸發器:
觸發器功能強大,輕鬆可靠地實現許多複雜的功能,為什麼又要慎用呢。觸發器本身沒有過錯,但濫用的話,將會造成資料庫及應用程式的維護困難。如果我們對觸發器過分的依賴,勢必影響資料庫的結構,同時增加了維護的複雜程度。所以觸發器雖好,但使用的時候要斟酌一下,在合適的情況下使用。
做重構版的一個感受的就是代碼量大大增加了。寫個增刪改查,建立實體,編寫介面,D層,B層,U層,層層調用。所以我們更要想辦法為代碼減負,使代碼精簡、便於複用。
學習資料庫技術是個良好的開始。
PS:關於觸發器這篇部落格介紹的比較詳細可供大家學習:http://www.cnblogs.com/kissdodog/p/3173421.html