上篇大致描述過trigger到底是什麼後,重點在於觸發事件時數字上的變動,今天來記錄一下。
inserted update deleted 觸發時,數字上的變換。
Trigger inserted
呈上篇的例子,如果我們銷售了一筆訂單 其中A物品被賣出,因此 庫存A 會 - 1
程式碼如下
DECLARE @QTY INTEGER
SET SELECT @QTY = SALE_QTY FROM INSERTED
UPDATE INV SET INV_QTY = INV_QTY - @QTY WHERE ITEM_NO = 'A'
Trigger Deleted
DELETED 其實跟 INSERTED 差不多,一個增加一個減少
DECLARE @QTY INTEGER
SET SELECT @QTY = SALE_QTY FROM DELETED
UPDATE INV SET INV_QTY = INV_QTY + @QTY WHERE ITEM_NO = 'A'
Trigger UPDATE
個人覺得比較複雜的應該是UPDATE,我們來思考一下。
假設本來我們銷售訂單中A貨品數量為1 則庫存減少 1
但現在發現打錯了,其實銷售訂單數量是10 那庫存應該要減少的是 10
其實TRIGGER 中 UPDATE 他就是做了 INSERTED 跟 DELETED
INSERTED 為 新的資料 也就是 10
DELETED 為 被更改的資料 也就是 1
如同上方的例子 庫存本來是 20 原本 -1 = 19 但因為輸入錯誤 應該要為 10 則
我們會將 新資料 - 舊資料 --> 10 - 1 = 9 並將本來的庫存 - 9 = 10
反之亦然
DECLARE @QTY_OLD INTEGER
DECLARE @QTY_NEW INTEGER
SET SELECT @QTY_OLD = SALE_QTY FROM DELETED // 舊 1
SET SELECT @QTY_NEW = SALE_QTY FROM INSERTED //新 10
UPDATE INV SET INV_QTY = INV_QTY - ( @QTY_NEW - @QTY_OLD) WHERE ITEM_NO = 'A'
只要記得這個 就不會搞不清楚 誰是新DATA 誰是舊的