MSSQL Trigger

今天來談談Trigger 以及 基本用法

Trigger 觸發事件

目前使用的是MSSQL 2005 ,當初其實不知道為什麼要寫trigger ,寫在程式裡面也可以啊。

但因為主管要求所以還是去專研如何撰寫Trigger。 

Trigger 如同一個觸發事件,假設一家商店 他賣出了A商品時 銷售 增加 則庫存便會減少一個

以上方例子來看,正常來說我們table應該會有 sale 跟 inventory 

當我們insert into sale table 一筆新訂單,則連動觸發trigger 去減少inventory table 的庫存

究竟該如何寫觸發事件呢?

在MSSQL中展開資料表並在觸發程序右鍵新增觸發程序

下方為MSSQL 寫trigger的編輯頁面但目前覺得最方便的還是Navicate for sql server ,所以此篇會利用此編輯器來操作

New Trigger >> 選擇 tablename 在這個表後觸發所以 after >>在insert 時觸發所以選擇insert


Trigger 基本語法

1. 在Trigger 中 宣告變數是利用 DECLARE 來宣告  

    例如: DECLARE  @Item_no VARCHAR(30) ​

2. 若要將值 設入 item_no 則要利用 SET 且字串是使用單引號

    例如:SET Item_no = 'p00001' 

3. 下SQL指令且將查詢的欄位注入變數中則需要以下這種寫法

    例如:  SET SELECT @ACTRB_DA = ACTRB_DA, @ACTRB_DP = ACTRB_DP FROM Atable

4. trigger 轉型可以利用Convert 或是 CAST ,假設欄位型態為date 將其轉成varchar則為以下這種寫法

   例如:  SET SELECT @ACTRB_DA = SUBSTRING(CONVERT(VARCHAR,ACTRB_DA,111),1,7) FROM Atable  --> 2018/08 

5. trigger 的 if else 需要有Beginend

    例如: IF(ACTRB_DA <> '2018/08')
                BEGIN 
      PRINT '月份不對'
                END
6.trigger 中 若 為 某個值,在條件式中 不是 == 而是


如何取得INSERT的參數

看完基本語法後,我們來想一下剛剛的例子。

我因為知道我賣了一樣商品所以庫存要-1,所以說在SALE TABLE中,應該會有一個欄位是銷售數量

因為我們要扣掉庫存,所以我們必須將這個銷售表中的銷售數量抓出來,才能進而去扣掉庫存。

因此如何取得我們剛剛INSERT 到 SALE表中 的 數量欄位呢? 如下

DECLARE @QTY INTEGER

SET SELECT @QTY = SALE_QTY FROM INSERTED 

因為我們是在SALE這張TABLE去做觸發,因此我們只要如同上方一樣,

整句的解釋如同:我要取得SALE表中剛剛INSERT進去的SALE_QTY並將他注入@QTY中即可

再來就是操作你後方的商業邏輯。