【機房重構】——觸發器
在耿建玲視訊中就學習了觸發器這個知識點,但是當時沒有認真的學習者塊知識,只知道觸發器是當我們對資料庫中的表進行操作的時候,自動觸發執行sql語句,但是到底是怎麼使用?以及基本語法是什麼都不是很清楚,所以在第一遍機房的時候也沒有用觸發器,因為當時發揚了“重複就是力量”的精神,都是一遍一遍的寫重複的程式碼。可是在重構的時候比較懶,不願意寫那些重複的程式碼,所以就對這個只是小研究了一下,下面和大家分享一下:
基本概念:
觸發器(trigger)是SQL server 提供給程式設計師和資料分析員來保證資料完整性的一種方法,它是與表事件相關的特殊的儲存過程,它的執行不是由程式呼叫,也不是手工啟動,而是由事件來觸發當我們對錶進行 增(Add)、刪(Delete)、改(Update)操作時,自動執行我們預先寫好的sql語句(可以包含複雜的sql語句)。
分類:
1、DML觸發器
當資料庫中表中的資料發生變化時,包括insert,update,delete任意操作,如果我們對該表寫了對應的DML觸發器,那麼該觸發器自動執行。DML觸發器的主要作用在於強制執行業 務規則,以及擴充套件Sql Server約束,預設值等。因為我們知道約束只能約束同一個表中的資料,而觸發器中則可以執行任意Sql命令。
2、DDL觸發器
它是Sql Server2005新增的觸發器,主要用於稽核與規範對資料庫中表,觸發器,檢視等結構上的操作。比如在修改表,修改列,新增表,新增列等。它在資料庫結構發生變化時執行,我們主要用它來記錄資料庫的修改過程,以及限制程式設計師對資料庫的修改,比如不允許刪除某些指定表等。
3、登入觸發器
登入觸發器將為響應 LOGIN 事件而激發儲存過程。與 SQL Server 例項建立使用者會話時將引發此事件。登入觸發器將在登入的身份驗證階段完成之後且使用者會話實際建立之前激發。因此,來自觸發器內部且通常將到達使用者的所有訊息(例如錯誤訊息和來自 PRINT 語句的訊息)會傳送到 SQL Server 錯誤日誌。如果身份驗證失敗,將不激發登入觸發器。
第一類觸發器是我們經常用到的一類,下面我就結合機房收費系統給大家介紹一下觸發器的基本語法和用法。
當我們充值和退卡的時候,我們不單要增加充值表和退卡表中的記錄,同時我們需要更新學生表中的餘額,這樣我們就可以用觸發器輕鬆實現,程式碼如下:
-- =============================================
-- Author: 鄭浩
-- Create date: 2014-12-26
-- Description: 當充值的時候更新學生表中的餘額
-- =============================================
ALTER TRIGGER [dbo].[Recharge] ’ 觸發器名稱
ON [dbo].[ZH_RechargeInfo] ’作用於那個表
AFTER INSERT '執行 插入操作
AS
BEGIN
--引發操作:向登錄檔和充值表中插入資料
update ZH_StudentInfo set Cash=cash+(select RechargeCash from inserted) where CardNo=(select CardNo from inserted)
END
大家可能注意到在程式碼中有這樣一個"inserted"東西,這個一個虛擬表來存放我們剛插入的資料,這樣我們就可以從這個虛擬表中獲取剛插入的資料。Update型觸發器和Insert非常相似,在這就不在列舉例項。
下面來看一下delete型的觸發器,當值班教師下班的時候,我們需要從正在值班教師表中刪除這條資料,同時在值班記錄表中插入資料,下面來看一下程式碼:
ALTER TRIGGER [dbo].[Trigger_OnWorkLog]
ON [dbo].[ZH_OnWorkInfo]
AFTER delete ’當執行delete操作時啟用觸發器
AS
declare @LoginDate date, ’宣告變數
@LoginTime varchar(50),
@LogoutDate date,
@LogoutTime varchar(50),
@Status varchar(50),
@WorkComputer varchar(50),
@UserID varchar(50)
select @UserID=UserID FROM deleted
select @LoginDate =LoginDate from deleted
select @LoginTime = LoginTime from deleted
select @WorkComputer=WorkComputer from deleted
set @LogoutDate =CONVERT (varchar (10),GETDATE (),120) --獲取日期
set @LogoutTime =CONVERT (varchar (10),GETDATE (),108) --獲取時間
set @Status = '未值班'
BEGIN
-- 引發操作
insert into ZH_WorkLogInfo(UserID,LoginDate,LoginTime,LogoutDate,LogoutTime,Status,WorkComputer) values(@UserID,@LoginDate,@LoginTime,@LogoutDate,@LogoutTime,@Status,@WorkComputer)
END
大家可以看到在上面的程式碼中有這樣一個“deleted”單詞,這也是一個虛擬表用來存放我們剛剛刪除的資料,它的機制是這樣的,當我們執行刪除操作的時候,它會將要刪除的資料存放在這張虛擬表中,當觸發器執行完成後,在將資料從虛擬表中徹底刪除。
優點:
我們都知道資料庫中的約束只能是對於一張表中的資料進行約束,而觸發器可以執行復雜的sql語句實現級聯修改,並且可以強制用比CHECK約束定義的約束更為複雜的約束,這樣更是對錶的操作更加簡單和靈活。
小結
在我們重構的時候應該有一種新的思路,儘可能的用不同的方法來實現要求,不能在延續第一遍機房的思想,如果那樣我們的重構就沒有意思了,應該加入一些新鮮血液,讓我們在前面學的更多的理論知識用於到實踐中。
在下一篇部落格將結合機房來淺析一下儲存過程。