今天剛好有網友詢問如何設定MSSQL Server 的Trigger
所以就把相關設定寫下來
這trigger 的動作是希望在有異動資料時
能將原本的資料及異動的資料都寫到log 去
所以就如下面這串啦
CREATE TRIGGER tritest ON [dbo].[fee]
FOR Update
AS
INSERT INTO [dbo].log1(modifier,updateTime) SELECT modifier, GETDATE() FROM INSERTED
INSERT INTO [dbo].log2(modifier,updateTime) SELECT modifier, GETDATE() FROM DELETED
這和Mysql 不太一樣的是 sqlserver提供了inserted及deleted 兩個temp table,當有異動資料觸發時
inserted會放新的資料而deleted會保有被修改或被刪除的資料
最近在服務一個舊客戶的系統,發現先前父子架構的關連,父table刪除時程式並未刪掉子table 相關的資料
所以導致出現了問題,原先設計並未使用foreign key及trigger,想要快速排除此問題又不想在程式加上code
最好還是加上foreign key或trigger吧…
在複雜的架構下,foreign key的使用會造成資料在維護上之不便,以先前開發的大型系統為例,資料庫是Oracle,一個rawdata table有關的table有二三十個,每個table 都是百萬筆起跳的,當全部關連都使用 foreign key時,問題來啦,當要刪除rawdata時,慢的和烏龜一樣,就算Oracle是裝在8 顆Cpu主機上也是一樣,所以如有這種狀況,改用Trigger或許是個好方法,不過前提還是要看你要做什麼事而定,如果只是刪父table資料時順便把相關的子table資料刪除時,這是一個好方法,使用方法如下:
CREATE TRIGGER test_tri BEFORE DELETE ON orders
FOR EACH ROW BEGIN
DELETE FROM orders2 WHERE orderid = OLD.id;
END
上述例子就下在刪除父table資料時會觸發一併刪除子table相關連的資料
trigger 觸發時間有上述例子使用的 before 還有after 主要是在發生delete , insert,update 之前或之後進行處理
FOR EACH ROW 是說明 對每一筆進行 用BEGIN …..END 將我們要執行的項目寫入
其中還可以包含邏輯運算式,以增加trigger 的使用彈性
在上例子有個OLD.id,這在trigger 裡面是有特殊意義的,這個OLD.id表示原本就存在資料庫的欄位資料
因為我們例子是在DELETE觸發,所以要用OLD,而NEW.id 當然就是指觸發時欄位的新資料,一般是用在insert及update 上
簡單介紹使用方式,如有想要知道更多,請參考以下網頁:
近期留言