マイクロソフト系技術情報 Wiki」は、「Open棟梁Project」,「OSSコンソーシアム .NET開発基盤部会」によって運営されています。

目次

概要

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

  • 体系
  • トリガ
  • DMLイベント(存在しない)

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イベントのみ存在する)

  • イベント通知とトリガについて
    http://msdn.microsoft.com/ja-jp/library/ms189855(v=sql.90).aspx
    • トリガを起動させるトランザクションのスコープ内で同期的に処理されます。
    • イベント通知を発生させるトランザクションのスコープ外で非同期に処理される。

複数行更新された後の処理

複数行更新された後の処理については注意が必要。
詳しくは、以下のページを参照のこと。

DML トリガの複数行に関する注意点
http://msdn.microsoft.com/ja-jp/library/ms190752.aspx

  • inserted テーブルと deleted テーブルを使用する(↓参照)。

insertedテーブルとdeletedテーブル

  • insertedテーブルには、
    INSERTステートメント、UPDATEステートメントの
    実行で影響を受けた行のコピーが格納されます。
  • deletedテーブルには、
    DELETEステートメント、UPDATEステートメントの
    実行で影響を受けた行のコピーが格納されます。

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

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

Tags: :データアクセス, :SQL Server


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2017-03-09 (木) 09:19:23 (839d)