SQL Server 2005 で使用できるトリガー TRIGGER に関するメモを記載します。

1. トリガーの種類

SQL Server 2005 では、 次のトリガーを作成できます。DMLはAFTERトリガとINSTEAD OF トリガに種類が分かれます。

  • DMLトリガ (AFTER トリガ, INSTEAD OF トリガ)
  • DDL トリガ

AFTER トリガはテーブルの処理が発生した直後に呼び出され、inserted をキーワードとして、新規(更新)行情報にアクセスでき、deleted キーワードを使用して、削除(更新前)行情報にアクセスできます。

INSTEAD OF トリガは、対象とするINSERT,UPDATE,DELETE処理の変わりに、INSERT,UPDATE,DELETEを実行するSQLを記述したい場合に使用します。VIEWに対して、INSERT,UPDATE,DELETEを行えるようにするために、INSTEAD OF トリガを使用する用途に使用できます。

1.1 トリガの作成

CREATE TRIGGER ステートメントでトリガーを作成します。

1.2 トリガの修正

ALTER TRIGGER ステートメントを使用します

1.3 トリガの有効無効を設定する

無効にする場合は、 DISABLE TRIGGER ステートメント、有効にする場合は ENABLE TRIGGER ステートメントを使用します。

1.4 トリガを削除するには

DROP TRIGGER ステートメントを使用します。

1.5 更新、新規データが設定された列を取得するには

トリガないで、UPDATE 関数を使用すると、更新の発生する列の判定を行えます。

1.6 処理を取り消す(ロールバックするには)

トリガ内のなんらかの判定処理でINSERT, UPDATE , DELETE 処理を取り消したい場合は、 ROLLBACK 文を記述することで、処理が取り消されます。

1.7 トリガのメタデータを取得するには

sys.triggers カタログビューを使用します。 トリガーの定義はsys.sql_modules と sys.objects を結合してトリガーの定義を sys.sql_modulesのdefinition 列を参照することで確認できます。

サーバーレベルのトリガイベントを取得するには、 sys.server_triggers や sys.server_trigger_events カタログビューを使用します。

1.8 トリガーのネストを制御するには、

トリガーの結果ほかのトリガーが発生しないようにするには、

EXEC  sp_configure 'nested triggers', 0
RECONFIGURE WITH OVERRIDE

でネストを無効にします。

ネストを可能にするには、

EXEC sp_configure 'nested triggers', 1 
RECONFIGUREWITHOVERRIDE

を実行します。

1.9 トリガーの再起を制御するには

トリガー内で同じテーブルに対するINSERT,UPDATE,DELETEが発生した場合に、再帰的にトリガーが呼び出されます。この振る舞いを有効にする場合は、次のステートメントを実行します。

ALTER DATABASE SampleDatabase
SET RECURSIVE_TRIGGERS ON

無効にする場合は次のステートメントを実行します

ALTER DATABASE SampleDatabase
SET RECURSIVE_TRIGGERS OFF

データベースセッティングを確認する場合は、

SELECT is_recursive_triggers_on
FROM sys.databases
WHERE name='SampleDatabase'

2. まとめ

今回の説明は以上です。TRIGGER は個人的にあんまり使用しないのですが使う機会があると起用にメモを作成しました。