MSSQL Trigger Inserted update deleted

上篇大致描述過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 誰是舊的