標籤:
機房重構中,有很多功能的實現涉及到對資料庫中多張表進行操作。比方說結賬,結賬成功之後實現的功能有:1、修改卡表的結賬狀態。2、修改充值表的結賬狀態。3、修改退卡表的結賬狀態。4、刪除卡表中不使用並且已結賬的卡的資訊。實現這些功能並不難,只要在D層中重新定義這些方法就OK了,但是這樣的效率並不高。有沒有一種既能實現這些功能又很高效的方法呢?這就涉及到對資料庫中觸發器的使用了。
觸發器
一﹕ 觸發器是一種特殊的預存程序,它不能被顯式地調用,而是在往表中插入記錄、更新記錄或者刪除記錄時被自動地啟用。所以觸發器可以用來實現對錶實施複雜的完整性條件約束。
二﹕ SQL Server為每個觸發器都建立了兩個專用表﹕Inserted表和Deleted表。這兩個表由系統來維護﹐它們存在於記憶體中而不是在資料庫中。這兩個表的結構總是與被該觸發器作用的表的結構相同。觸發器執行 完成後﹐與該觸發器相關的這兩個表也被刪除。 Deleted表存放由於執行Delete或Update語句而要從表中刪除的所有行。Inserted表存放由於執行Insert或Update語句而要向表中插入的所有行。
三﹕常見的觸發器有兩種:after(for)、instead of,用於insert、update、delete事件。after(for) 表示執行代碼後,執行觸發器;instead of 表示執行代碼前,用已經寫好的觸發器代替你的操作。
四:文法
create trigger 觸發器的名字 on 動作表 for|after instead of update|insert|delete as SQL語句
下面是針對結賬的功能自己寫的一個觸發器,它不僅能協助我實現功能,也能避免在D層中寫過多的代碼!
應用:
CREATE TRIGGER triggerc_UpdateBon Card_info after update as if update ([ICheck]) update ReturnCard_info set ICheck='已結賬'where ICheck='未結賬' and UserID=(select top 1 UserID from INSERTED ) update Recharge_info set ICheck='已結賬'where ICheck='未結賬' and UserID=(select top 1 UserID from INSERTED ) delete from Card_info where ICheck='已結賬' and UState='不使用'
總結:
之前學習資料庫的時候,瞭解了觸發器。當時沒有去應用這個知識,重構中用到了才發現它的功能是如此之強大。果然,實踐出真知。
【機房收費系統】之觸發器的使用