Archive

文章標籤 ‘trigger’

MS SQL Server 設定Trigger 語法

2009年5月13日 尚無評論

今天剛好有網友詢問如何設定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會保有被修改或被刪除的資料

Categories: Database Tags: ,

MySQL Trigger 簡單介紹用法

2008年12月17日 尚無評論

最近在服務一個舊客戶的系統,發現先前父子架構的關連,父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 上

簡單介紹使用方式,如有想要知道更多,請參考以下網頁:

Categories: Database Tags: ,