【SQL觸發器】類型 FOR 、AFTER、 Instead of到底是什么鬼


前言:
上一篇博客(博客連接: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觸發器,真正起作用的是觸發器里面的動作!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM