1. 程式人生 > >【SQL觸發器】型別 FOR 、AFTER、 Instead of到底是什麼鬼

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

前言:

上一篇部落格講述了觸發器的基本概念,觸發器什麼時候用,為什麼用!這篇部落格將簡述觸發器的型別,由於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觸發器,真正起作用的是觸發器裡面的動作!