[[Open棟梁Project>http://opentouryo.osscons.jp/]] - [[マイクロソフト系技術情報 Wiki>http://techinfoofmicrosofttech.osscons.jp/]]
「[[マイクロソフト系技術情報 Wiki>http://techinfoofmicrosofttech.osscons.jp/]]」は、「[[Open棟梁Project>https://github.com/OpenTouryoProject/]]」,「[[OSSコンソーシアム .NET開発基盤部会>https://www.osscons.jp/dotNetDevelopmentInfrastructure/]]」によって運営されています。

-[[戻る>SQL Server]]

* 目次 [#hde9a463]
#contents

*概要 [#j1da2539]
トリガには、DMLトリガとDDLトリガがある。~
トリガの他にイベント通知と言うものがある。~

-体系

--トリガ

---DMLトリガ~
 http://msdn.microsoft.com/ja-jp/library/ms178110.aspx~
 ● DML トリガの種類~
   http://msdn.microsoft.com/ja-jp/library/ms178134.aspx~
   ● AFTER トリガ~
   ● INSTEAD OF トリガ~
   ● DML トリガのプランニング ガイドライン~
     http://msdn.microsoft.com/ja-jp/library/ms190267.aspx

---DDLトリガ~
 http://msdn.microsoft.com/ja-jp/library/ms175941.aspx

--イベント通知~
 http://msdn.microsoft.com/ja-jp/library/ms186376.aspx

---DMLイベント(存在しない)

---DDLイベント~
 http://msdn.microsoft.com/ja-jp/library/bb522542.aspx

*DMLトリガ [#ubedde95]
**検証 [#ma637c29]
-@IT:テーブルで複数の処理を実行させるトリガー~
http://www.atmarkit.co.jp/fnetwork/rensai/sql24/sql1.html

-SqlServer のSQLでSleepさせる方法  プログラマ備忘録~
http://it.emise.net/?p=77

***メッセージを登録 [#q710faa3]
 EXEC sp_addmessage
  @msgnum = 50001,
  @severity = 10,
  @msgtext = 'Trigger Executed',
  @lang = 'us_english',
  @with_log = true,
  --@replace= 'replace'

***トリガを登録(待機とログ出力) [#zf10f127]
 CREATE TRIGGER trNotifyCustomerUpdate ON Customers
  FOR INSERT, UPDATE, DELETE
  AS
  BEGIN
   WAITFOR DELAY '00:01:00';
   RAISERROR (50001,10,10);
  END

***トリガを起動 [#ge7a167b]
 UPDATE Customers SET Country = 'USA' WHERE Country = 'USA'

***結果確認 [#ia5dcac0]
(13 行処理されました)~
~
↓~
~
13行が対象となってもトリガ起動は1回だけの模様。~
#処理時間1分、ログ出力1回~

**非同期実行 [#ye6eb436]
トリガではなく、イベント通知を使用します。~
(ただし、DMLイベントは存在せず、DDLイベントのみ存在する)~
~
-イベント通知とトリガについて~
http://msdn.microsoft.com/ja-jp/library/ms189855(v=sql.90).aspx
--トリガを起動させるトランザクションのスコープ内で同期的に処理されます。
--イベント通知を発生させるトランザクションのスコープ外で非同期に処理される。

**複数行更新された後の処理 [#ze71ec54]

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

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

-@@ROWCOUNT 関数を使用する。~
 @@ROWCOUNT (Transact-SQL)~
 http://msdn.microsoft.com/ja-jp/library/ms187316.aspx

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

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

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

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

***insertedテーブルの使用例 [#de3edb88]
 -- 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