基本結構
[Tr_Name]為觸發器名稱,[Table_Name]為觸發器依附的表,FOR后面為觸發時機,AS后為觸發器主體,從BEGIN開始到END結束。
CREATE TRIGGER [dbo].[Tr_Name] ON [dbo].[Table_Name] FOR INSERT,UPDATE AS BEGIN --DO SOMETHING END
觸發時機
觸發器在何時生效?當[Table_Name]發生變化時生效,可選事件有:INSERT、UPDATE、DELETE;
可以多選,以逗號分隔,如:FOR INSERT,UPDATE。
內存數據表:INSERTED與DELETED
INSERTED和DELETED是內存表,用於臨時存放數據,結構與當前表相同(即列名及類型相同)。
數據庫在更新、刪除數據之前,新數據存放於INSERTED,舊數據存放於DELETED。
INSERTED:即將INSERT、UPDATE的數據;
DELETED:被UPDATE、DELETE前的數據。
BEGIN DECLARE @Status INT DECLARE @InterID INT SELECT @InterID = FInterID FROM DELETED SELECT @Status = FStatus FROM INSERTED --DO SOMETHING WITH @Status & @InterID END
應用方法
在觸發器主體中,從內存中獲取有用的數據存放在變量中,在后續能發揮重要作用。
例如,獲取當前表的ID,后續更新其他表時可定位到與當前表相關的記錄,而達到排除無關記錄的目的。
又或者,在數據更新之前,先判斷數據的合法性、邏輯性,根據條件執行不同的任務,或拋出異常等等。
修改
把關鍵字CREATE改成ALTER即可。
注意:如果觸發器已經創建,不能對同一個觸發器重復執行CREATE命令。
刪除
可以直接DROP TRIGGER [Tr_Name],但是如果觸發器不存在時會報錯。
推薦的寫法是,先判斷觸發器是否存在,如果存在,刪除,否則跳過。
IF OBJECT_ID ('Tr_Name', 'TR') IS NOT NULL DROP TRIGGER Tr_Name
