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