SQLServer触发器


一、定义

触发器: 在对数据库数据进行操作(增加(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触发器的操作。

 

注:本人菜鸟

  如有错误,请指出。谢谢!

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM