最初と最後のトリガの指定
テーブルに関連付けられている AFTER トリガの 1 つを、INSERT、DELETE、および UPDATE の各トリガ動作に対して起動される、最初の AFTER トリガまたは最後の AFTER トリガのいずれかに指定できます。最初と最後のトリガの間で起動される AFTER トリガは、任意の順序で実行されます。
AFTER トリガの順序を指定するには、sp_settriggerorder ストアド プロシージャを使用します。sp_settriggerorder には次のオプションがあります。
オプション |
説明 |
---|---|
First |
DML トリガが、トリガ動作に対して起動される最初の AFTER トリガであることを指定します。 |
Last |
DML トリガが、トリガ動作に対して起動される最後の AFTER トリガであることを指定します。 |
None |
DML トリガを起動する特定の順番がないことを指定します。主に最初または最後のトリガのいずれかの順序をリセットするときに使用します。 |
次の例は、sp_settriggerorder を使用する例を示しています。
sp_settriggerorder @triggername = 'MyTrigger', @order = 'first', @stmttype = 'UPDATE'
重要 |
---|
最初のトリガと最後のトリガは、2 つの異なる DML トリガである必要があります。 |
テーブルでは、INSERT、UPDATE、および DELETE の各トリガを同時に定義することができます。各ステートメントはその型ごとに、固有の最初と最後のトリガを持つことができますが、最初と最後に同じトリガを持つことはできません。
1 つのテーブルに定義された最初のトリガまたは最後のトリガが、FOR UPDATE、FOR DELETE、または FOR INSERT などのトリガ動作に対応していない場合は、それらの動作に対する最初のトリガまたは最後のトリガを設定できません。
INSTEAD OF トリガは最初のトリガまたは最後のトリガとして指定できません。INSTEAD OF トリガは基になるテーブルが更新される前に起動されるためです。INSTEAD OF トリガによって基になるテーブルが更新された場合、テーブルで定義された AFTER トリガが起動される前に更新が発生します。たとえば、ビュー上の INSTEAD OF INSERT トリガによってベース テーブルにデータが挿入され、ベース テーブル自体に INSTEAD OF INSERT トリガおよび 3 つの AFTER INSERT トリガが含まれる場合、挿入操作の代わりに、ベース テーブルにある INSTEAD OF INSERT トリガが起動されます。また、ベース テーブルでの挿入操作の後、ベース テーブルにある AFTER トリガが起動されます。詳細については、「DML トリガの起動条件の指定」を参照してください。
ALTER TRIGGER ステートメントによって最初のトリガまたは最後のトリガが変更された場合、First 属性または Last 属性が削除され、順序の値が None に設定されます。sp_settriggerorder を使用して順序をリセットする必要があります。
OBJECTPROPERTY 関数は、トリガが最初のトリガであるか、または最後のトリガであるかを、ExecIsFirstTrigger プロパティおよび ExecIsLastTrigger プロパティを使用して示します。
即時更新サブスクリプションまたはキュー更新サブスクリプションに含まれるテーブルでは、レプリケーションによって最初のトリガが自動的に生成されます。レプリケーションのトリガは最初のトリガであることが必要です。即時更新サブスクリプションまたはキュー更新サブスクリプションに、最初のトリガが存在するテーブルを含めようとすると、レプリケーションでエラーが発生します。テーブルをサブスクリプションに含めた後で、トリガを最初のトリガにしようとすると、sp_settriggerorder によってエラーが返されます。レプリケーション トリガに ALTER を使用したり、sp_settriggerorder を使用してレプリケーション トリガを最後のトリガまたは順序なしのトリガに変更すると、サブスクリプションは正しく動作しません。