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