DML トリガの実装

DML トリガを作成するときには、次の点を考慮してください。

  • トリガのバッチの最初のステートメントは CREATE TRIGGER である必要があります。バッチ内のすべての後続ステートメントは、CREATE TRIGGER ステートメントの定義の一部と解釈されます。
  • DML トリガを作成する権限は、既定ではテーブルの所有者にあり、その権限を他のユーザーに譲渡することはできません。
  • DML トリガはデータベース オブジェクトなので、その名前は識別子の規則に従う必要があります。
  • DML トリガは現在のデータベース内にしか作成できませんが、他のデータベースのオブジェクトを参照することができます。
  • DML トリガは一時テーブルを参照できますが、一時テーブルまたはシステム テーブルに DML トリガを作成することはできません。システム テーブルは参照できません。代わりに、情報スキーマ ビューを使用します。
  • DELETE 動作または UPDATE 動作と共に定義された外部キーを含むテーブルには、INSTEAD OF DELETE トリガと INSTEAD OF UPDATE トリガは定義できません。
  • TRUNCATE TABLE ステートメントは WHERE 句のない DELETE ステートメントと同じですべての行を削除しますが、TRUNCATE TABLE ステートメントはログに記録されないので、DELETE トリガは起動されません。
  • WRITETEXT ステートメントでは、INSERT トリガまたは UPDATE トリガは起動されません。
ms187834.note(ja-jp,SQL.90).gif重要 :
今後のバージョンの SQL Server では、トリガを使用して結果セットを返す機能が削除される予定です。結果セットを返すトリガは、それと連動するように設計されていないアプリケーションでは予期しない動作を起こすことがあります。新しい開発作業では、トリガを使用して結果セットを返すことを避け、現在この方法を使用しているアプリケーションについては変更を検討してください。SQL Server 2005 でトリガを使用して結果セットを返さないようにするには、disallow results from triggers オプションを 1 に設定します。今後のバージョンの SQL Server では、このオプションの既定の設定は 1 になります。

DML トリガを作成するときは、次の項目を指定します。

  • トリガの名前。
  • トリガを定義するテーブル。
  • トリガの起動条件。
  • トリガを起動するデータ修正ステートメント。指定できるステートメントは INSERT、UPDATE、または DELETE です。複数のデータ修正ステートメントで同じトリガを起動することもできます。たとえば、INSERT ステートメントや UPDATE ステートメントはトリガを起動できます。
  • トリガの動作を実行するプログラミング ステートメント。

複数の DML トリガ

それぞれの名前が異なっていれば、1 つのテーブルに同じ種類の AFTER トリガを複数定義でき、各トリガでさまざまな処理を実行できます。ただし、1 つのトリガは 3 種類のユーザー操作 (UPDATE、INSERT、および DELETE) の任意のサブセットに適用できますが、各トリガに適用できるテーブルは、1 つのみです。

同じ種類の INSTEAD OF トリガは、各テーブルに 1 つしか定義できません。

トリガの権限と所有権

トリガが定義されるテーブルまたはビューのスキーマでトリガが作成されます。たとえば、テーブル HumanResources.Employee でトリガ Trigger1 が作成されると、トリガのスキーマ修飾名は HumanResources.Trigger1 になります。

CREATE TRIGGER 権限は、特に指定のない限り、トリガが定義されているテーブルの所有者、固定サーバー ロール sysadmin、および固定データベース ロール db_ownerdb_ddladmin のメンバに与えられ、譲渡できません。

INSTEAD OF トリガをビューに作成する場合、そのビューの所有者がビューとトリガが参照するベース テーブルを所有していないときは、その所有権の継承が途切れます。ビューの所有者がベース テーブルを所有していない場合、テーブルの所有者は、そのビューの読み取りや更新を行うすべてのユーザーに、必要な権限を個別に許可する必要があります。同じユーザーがビューと基になるベース テーブルの両方を所有している場合は、他のユーザーに個別のベース テーブルではなく、ビューに対してのみの権限を許可する必要があります。詳細については、「所有権の継承」を参照してください。

トリガを作成するには