一、定義
觸發器: 在對數據庫數據進行操作(增加(insert)、修改(update)、刪除(delete))后,可以自動執行的操作
觸發器分為兩類:instead of 觸發器 ,after(for)觸發器。
instead of 觸發器:在數據更新到數據庫之前執行的操作
after(for)觸發器:在數據更新到數據后再執行的操作
數據臨時載體:inserted和deleted
inserted:存儲操作中新增的或者更新的數據
deleted:存儲操作中刪除的數據
二、操作
1. 新建觸發器
1 --Insert操作INSTEAD OF 觸發器 2 CREATE TRIGGER TRI_ORDER_BEFOREINSERT 3 ON MyOrder 4 INSTEAD OF INSERT 5 AS 6 SELECT 'BEFOREINSERT' 7 GO 8 9 --Insert操作AFTER 觸發器 10 CREATE TRIGGER TRI_ORDER_AFTERINSERT 11 ON MyOrder 12 AFTER INSERT 13 AS 14 SELECT 'AFTERINSERT' 15 GO 16 17 --UPDATE操作INSTEAD OF 觸發器 18 CREATE TRIGGER TRI_ORDER_BEFOREUPDATE 19 ON MYORDER 20 INSTEAD OF UPDATE 21 AS 22 SELECT 'BEFOREUPDATE' 23 GO 24 25 --UPDATE操作INSTEAD OF 觸發器 26 CREATE TRIGGER TRI_ORDER_AFTERUPDATE 27 ON MYORDER 28 AFTER UPDATE 29 AS 30 SELECT 'AFTERUPDATE' 31 GO
2. 新增
1 INSERT INTO MyOrder (OrderCode,OrderStatus,DocSex) VALUES('001',1,1)
結果如圖:
只觸發了Insert操作INSTEAD OF 觸發器,而After觸發器沒有觸發,並且數據新增失敗
3.在Insert操作INSTEAD OF 觸發器添加新增操作
1 --Insert操作INSTEAD OF 觸發器 2 ALTER TRIGGER TRI_ORDER_BEFOREINSERT 3 ON MyOrder 4 INSTEAD OF INSERT 5 AS 6 7 SELECT 'BEFOREINSERT' 8 DECLare @DocSex INT 9 10 SELECT @DocSex = DocSex From inserted 11 IF(@DocSex =1) 12 BEGIN 13 INSERT INTO MyOrder 14 SELECT * FROM inserted 15 END 16 GO
4.再次執行新增語句
1 INSERT INTO MyOrder (OrderCode,OrderStatus,DocSex) VALUES('001',1,1)
結果如圖:
Insert操作INSTEAD OF 觸發器和After觸發器都觸發了,並且數據新增成功
5.代碼里面我們添加了DocSex=1的條件過濾,下面我們添加一條DocSex=2的記錄看看
1 INSERT INTO MyOrder (OrderCode,OrderStatus,DocSex) VALUES('002',1,2)
結果如圖:
只觸發了Insert操作INSTEAD OF 觸發器,而After觸發器沒有觸發,並且數據新增失敗
上述結果說明: 如果同時存在NSTEAD OF 觸發器和After觸發器,數據庫會先執行NSTEAD OF 觸發器,在NSTEAD OF 觸發器中經過篩選再執行NSTEAD OF 觸發器中的Insert操作才會觸發After觸發器。(NSTEAD OF 觸發器里面的校驗操作是發生在主鍵、外鍵等數據庫約束判斷之前的,有興趣的同學可以嘗試一下)。針對於Update操作邏輯相同
6.Insert操作INSTEAD OF 觸發器中添加Update操作
--Insert操作INSTEAD OF 觸發器 ALTER TRIGGER TRI_ORDER_BEFOREINSERT ON MyOrder INSTEAD OF INSERT AS SELECT 'BEFOREINSERT' DECLare @DocSex INT SELECT @DocSex = DocSex From inserted IF(@DocSex =1) BEGIN INSERT INTO MyOrder SELECT * FROM inserted UPDATE MyOrder SET DocSexDesc =N'男' WHERE OrderCode='001' END GO
執行新增語句
1 INSERT INTO MyOrder (OrderCode,OrderStatus,DocSex) VALUES('002',1,1)
結果如圖:
Update的觸發器只執行了After觸發器,說明在INSTEAD OF 觸發器中執行的操作只會觸發After觸發器的操作,而不會觸發INSTEAD OF 觸發器的操作
7.Insert操作After觸發器中添加Update操作,為避免混亂先刪除Instead of 觸發器中的Update操作
1 --Insert操作INSTEAD OF 觸發器 2 ALTER TRIGGER TRI_ORDER_BEFOREINSERT 3 ON MyOrder 4 INSTEAD OF INSERT 5 AS 6 7 SELECT 'BEFOREINSERT' 8 DECLare @DocSex INT 9 10 SELECT @DocSex = DocSex From inserted 11 IF(@DocSex =1) 12 BEGIN 13 INSERT INTO MyOrder 14 SELECT * FROM inserted 15 --UPDATE MyOrder 16 --SET DocSexDesc =N'男' 17 --WHERE OrderCode='001' 18 END 19 GO 20 21 --Insert操作AFTER 觸發器 22 ALTER TRIGGER TRI_ORDER_AFTERINSERT 23 ON MyOrder 24 AFTER INSERT 25 AS 26 SELECT 'AFTERINSERT' 27 UPDATE MyOrder 28 SET OrderStatusDesc =N'未完成' 29 WHERE OrderCode='002' 30 GO
執行新增語句
1 INSERT INTO MyOrder (OrderCode,OrderStatus,DocSex) VALUES('003',1,1)
結果如圖:
Update的觸發器只執行了After觸發器,說明在After 觸發器中執行的操作只會觸發After觸發器的操作,也不會觸發INSTEAD OF 觸發器的操作
7. 如果沒有INSTEAD OF 觸發器,會自動執行After觸發器的操作。
注:本人菜鳥
如有錯誤,請指出。謝謝!