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 トリガは起動されません。
重要 |
---|
今後のバージョンの SQL Server では、トリガを使用して結果セットを返す機能が削除される予定です。結果セットを返すトリガは、それと連動するように設計されていないアプリケーションでは予期しない動作を起こすことがあります。新しい開発作業では、トリガを使用して結果セットを返すことを避け、現在この方法を使用しているアプリケーションについては変更を検討してください。SQL Server でトリガを使用して結果セットを返さないようにするには、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_owner と db_ddladmin のメンバに与えられ、譲渡できません。
INSTEAD OF トリガをビューに作成する場合、そのビューの所有者がビューとトリガが参照するベース テーブルを所有していないときは、その所有権の継承が途切れます。ビューの所有者がベース テーブルを所有していない場合、テーブルの所有者は、そのビューの読み取りや更新を行うすべてのユーザーに、必要な権限を個別に許可する必要があります。同じユーザーがビューと基になるベース テーブルの両方を所有している場合は、他のユーザーに個別のベース テーブルではなく、ビューに対してのみの権限を許可する必要があります。詳細については、「所有権の継承」を参照してください。
トリガを作成するには