前言:
上一篇博客(博客連接:https://blog.csdn.net/jerry11112/article/details/82924714 講述了觸發器的基本概念,觸發器什么時候用,為什么用!這篇博客將簡述觸發器的類型,由於FOR觸發器與AFTER觸發器是一個作用,所以觸發器分為AFTER觸發器,與Instead of 觸發器!
為了讓大家明白觸發器,我先把我的數據庫是干嘛的給大家介紹一下吧,我的數據庫是一個新聞發系統對應的數據庫 ,里邊有兩個表一個是新聞類別表caregory ,還有一個是新聞表news,其中一條類新聞對應多條新聞,但是一條新聞只是屬於一類!故有下圖!其中news表的主鍵為id,外鍵為caID,與care gory的主鍵相對,此時通過主外鍵將兩個表連接起來!

接下來我們要完成的操作是刪除表中一條新聞類別信息,我們此時建立一條delete觸發器,通過這個觸發器我們來了解一下AFTER觸發器與instead of 觸發器之間到底有何區別!
1、AFTER(for)觸發器 (操作后)
after觸發器是指在操作成功后,所采取的一些動作!
比如:下面是我創建好的一個after觸發器
SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO creat trigger [dbo].[T_CaregoryDelete] --觸發器的名字為T_CaregoryDelete on [dbo].[caregory] --是caregory類別表的觸發器 after delete --after代表執行刪除后執行as后邊的語句 as begin delete news where caId=(select id from deleted) --激發觸發器后我要執行的動作,其中deleted是一個系統默認臨時表 end
接下來我編譯代碼
delete from caregory where id=4,報了如下的錯誤!

剛才我說過了,我們的類別表caregory與新聞表news表是通過主外鍵連接的,我們在執行語句delete from caregory where id=4的時候我們的news表對應的新聞也應該被刪除!如下所示圖!


但是我們的after觸發器只能是在執行完delete操作后執行,如果此時我們執行
delete from caregory where id=4 ,那么我們將我們id信息為4的類別的新聞刪除后才可以觸發觸發器,那么我們的這類新聞下的所有新聞就不能被刪除了,這時候我們的表是主外鍵連接的,所以就報了上述錯誤!那么這下該怎么辦呢,這時候解決instead of 觸發器登場!
2、instead of 觸發器
對數據的操作只是一個“導火索”而已,真正起作用的是觸發器里面的動作;往往這種觸發器會有很多分支判斷語句在里面,根據不用的條件做不同的動作!
INSTEAD OF 觸發器用來代替通常的觸發動作,即當對表進行INSERT、UPDATE 或 DELETE 操作時,系統不是直接對表執行這些操作,而是把操作內容交給觸發器,讓觸發器檢查所進行的操作是否正確。如正確才進行相應的操作。因此,INSTEAD OF 觸發器的動作要早於表的約束處理。
真正起作用的是觸發器里面的動作,接下來是對應觸發器的代碼
SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO ALTER trigger [dbo].[T_CaregoryDelete] on [dbo].[caregory] instead of delete as begin delete news where caId=(select id from deleted) delete caregory where id=(select id from deleted) end
此時執行語句delete from caregory where id=4,那么我們就成功的將我們類別表信息刪除,同時將我們類別表下對應的這類的新聞頁一塊刪除了!
這里可能有人就有疑問了,算上delete from caregory where id=4 共有三個delete,注意上面我強調了一句話,真正起作用的是觸發器里面的動作!
后記:
after觸發器是在操作成功后,所采取的一些動作
而對於instead of觸發器,真正起作用的是觸發器里面的動作!
