Open棟梁Project - マイクロソフト系技術情報 Wiki
トリガには、DMLトリガとDDLトリガがある。
トリガの他にイベント通知と言うものがある。
EXEC sp_addmessage @msgnum = 50001, @severity = 10, @msgtext = 'Trigger Executed', @lang = 'us_english', @with_log = true, --@replace= 'replace'
CREATE TRIGGER trNotifyCustomerUpdate ON Customers FOR INSERT, UPDATE, DELETE AS BEGIN WAITFOR DELAY '00:01:00'; RAISERROR (50001,10,10); END
UPDATE Customers SET Country = 'USA' WHERE Country = 'USA'
(13 行処理されました)
↓
13行が対象となってもトリガ起動は1回だけの模様。
#処理時間1分、ログ出力1回
トリガではなく、イベント通知を使用します。
(ただし、DMLイベントは存在せず、DDLイベントのみ存在する)
複数行更新された後の処理については注意が必要。
詳しくは、以下のページを参照のこと。
DML トリガの複数行に関する注意点
http://msdn.microsoft.com/ja-jp/library/ms190752.aspx
詳しくは、以下のページを参照のこと。
inserted テーブルと deleted テーブルの使用
http://msdn.microsoft.com/ja-jp/library/ms191300.aspx
-- Trigger valid for multirow and single row inserts -- and optimal for single row inserts. USE AdventureWorks2012; GO CREATE TRIGGER NewPODetail3 ON Purchasing.PurchaseOrderDetail FOR INSERT AS IF @@ROWCOUNT = 1 BEGIN -- 1行の時はLineTotalをそのまま -- Purchasing.PurchaseOrderHeaderに足し込む。 UPDATE Purchasing.PurchaseOrderHeader SET SubTotal = SubTotal + LineTotal FROM inserted WHERE PurchaseOrderHeader.PurchaseOrderID = inserted.PurchaseOrderID END ELSE BEGIN -- 複数行の時は -- inserted.LineTotalを合計して -- Purchasing.PurchaseOrderHeaderに足し込む。 -- WHERE句にはIN句にinserted.PurchaseOrderIDを指定し順次処理する。 UPDATE Purchasing.PurchaseOrderHeader SET SubTotal = SubTotal + (SELECT SUM(LineTotal) FROM inserted WHERE PurchaseOrderHeader.PurchaseOrderID = inserted.PurchaseOrderID) WHERE PurchaseOrderHeader.PurchaseOrderID IN (SELECT PurchaseOrderID FROM inserted) END