今天來談談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 需要有Begin 跟 end
例如: 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中即可
再來就是操作你後方的商業邏輯。