- 追加された行はこの色です。
- 削除された行はこの色です。
[[Open棟梁Project>http://opentouryo.osscons.jp/]] - [[マイクロソフト系技術情報 Wiki>http://techinfoofmicrosofttech.osscons.jp/]]
-[[戻る>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]]