SQL - 如何判斷 Trigger 現在是 Insert Update Delete

摘要:SQL - 如何判斷 Trigger 現在是 Insert Update Delete

在 進入此次主題之前,先來說說 Trigger (觸發程序) 吧。Trigger 可以說是一個開關,當你對資料表做出交易 (Insert、Update、Delete) 時 (或後),就會啟動 Trigger 的開關;這時,Trigger 就會很盡責的去執行一些商業邏輯運算 (包含 Bug)。不過,Trigger 除錯不易,畢竟 Trigger 也是一種黑盒子,在實際環境運作時,作對作錯都很難知道,所以在設計時,要分外小心,多用一些 Print、Try~Catch、Transaction 與 Rollback。那當 Delete 時,我應該如何抓到 Delete 的那筆資料的資訊呢!? 因為有可能會需拿著 Delete 的資訊,再去作其他的邏輯運算,那這資訊應該在哪裡得知呢!? 那就來看看下圖唄...



有 看懂嘛!? 意思很簡單,當 Insert 時,除了將資料新增到資料表中外,在 INSERTED 中,也會保留資料。Delete 時,也會將資料在 Deleted 中保留。Update 的運作,是先將資料表中的資料先刪除再新增,所以在 INSERTED 中,會記錄薪資料的記錄,而在 DELETED 會保留舊的記錄。所以,應該就了解要如何判斷,現在的 Trigger 是在 Insert、Update 或 Delete 了。

Code:

CREATE TRIGGER dbo.使用者資料觸發程序
   ON dbo.使用者資料
   AFTER INSERT,DELETE,UPDATE
AS
BEGIN
 SET NOCOUNT ON;

    if (Select Count(*) From inserted) > 0 and (Select Count(*) From deleted) = 0
    begin
  print ('新增')
    end
   
    if (Select Count(*) From inserted) = 0 and (Select Count(*) From deleted) > 0
    begin
  print ('刪除')
    end
   
    if (Select Count(*) From inserted) > 0 and (Select Count(*) From deleted) > 0
    begin
  print ('修改')
    end

END
GO

結果:


參考:
CREATE TRIGGER (Transact-SQL)
DML 觸發程序
DDL 觸發程序