Open棟梁Project - マイクロソフト系技術情報 Wiki

目次

概要

トリガには、DMLトリガとDDLトリガがある。
トリガの他にイベント通知と言うものがある。

DMLトリガ

検証

メッセージを登録

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テーブル

詳しくは、以下のページを参照のこと。

inserted テーブルと deleted テーブルの使用
http://msdn.microsoft.com/ja-jp/library/ms191300.aspx

insertedテーブルの使用例

-- 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

トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS