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
Tags: :データアクセス, :SQL Server