一、定义
触发器: 在对数据库数据进行操作(增加(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触发器的操作。
注:本人菜鸟
如有错误,请指出。谢谢!