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