次の方法で共有


最初のトリガーと最後のトリガーを指定する

テーブルに関連付けられている AFTER トリガーの 1 つを、INSERT、DELETE、UPDATE トリガーの各アクションに対して起動される最初の AFTER トリガーまたは最後の AFTER トリガーに指定できます。 最初のトリガーと最後のトリガーの間で起動される AFTER トリガーは、未定義の順序で実行されます。

AFTER トリガーの順序を指定するには、 sp_settriggerorder ストアド プロシージャを使用します。 sp_settriggerorder には、次のオプションがあります。

選択肢 説明
まずは DML トリガーが、トリガーアクションに対して起動された最初の AFTER トリガーであることを指定します。
最新 DML トリガーが、トリガーアクションに対して起動された最後の AFTER トリガーであることを指定します。
なし DML トリガーを起動する特定の順序がないことを指定します。 主に、トリガーが最初または最後のいずれかからリセットするために使用されます。

次の例は、 sp_settriggerorderの使用を示しています。

sp_settriggerorder @triggername = 'MyTrigger', @order = 'first', @stmttype = 'UPDATE'  

重要

最初と最後のトリガーは、2 つの異なる DML トリガーである必要があります。

テーブルには、INSERT、UPDATE、および DELETE トリガーを同時に定義できます。 各ステートメントの種類は、独自の最初と最後のトリガーを持つことができますが、同じトリガーにすることはできません。

テーブルに対して定義された最初または最後のトリガーが、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 Triggers」をご覧ください。

ALTER TRIGGER ステートメントが最初または最後のトリガーを変更すると、 First 属性または Last 属性が削除され、順序値が None に設定されます。 注文は 、sp_settriggerorderを使用してリセットする必要があります。

OBJECTPROPERTY 関数は、 ExecIsFirstTrigger プロパティと ExecIsLastTrigger プロパティを使用して、トリガーが最初のトリガーか最後のトリガーかを報告します。

レプリケーションでは、即時更新サブスクリプションまたはキュー更新サブスクリプションに含まれるテーブルの最初のトリガーが自動的に生成されます。 レプリケーションでは、そのトリガーが最初のトリガーである必要があります。 レプリケーションでは、即時更新サブスクリプションまたはキュー更新サブスクリプションに最初のトリガーを含むテーブルを含めようとすると、エラーが発生します。 テーブルがサブスクリプションに含まれた後にトリガーを最初のトリガーにしようとすると、 sp_settriggerorder はエラーを返します。 レプリケーション トリガーで ALTER を使用するか 、sp_settriggerorder を使用してレプリケーション トリガーを最後のトリガーまたはなしトリガーに変更した場合、サブスクリプションは正しく機能しません。

こちらもご覧ください

OBJECTPROPERTY (Transact-SQL)
sp_settriggerorder (Transact-SQL)