sp_settriggerorder (Transact-SQL)
最初または最後に起動される AFTER トリガーを指定します。最初と最後のトリガーの間で起動される AFTER トリガーは、任意の順序で実行されます。
構文
sp_settriggerorder [ @triggername = ] '[ triggerschema. ] triggername'
, [ @order = ] 'value'
, [ @stmttype = ] 'statement_type'
[ , [ @namespace = ] { 'DATABASE' | 'SERVER' | NULL } ]
引数
[ @triggername= ] '[ triggerschema**.] triggername'**
順序を設定または変更するトリガーの名前と、(該当する場合は) そのトリガーが属するスキーマを指定します。[triggerschema**.**]triggername は sysname です。名前がトリガーに対応していない場合、または名前が INSTEAD OF トリガーに対応している場合は、エラーが返されます。triggerschema は、DDL トリガーおよびログオン トリガーに対しては指定できません。[ @order= ] 'value'
新しいトリガー順序の設定です。value は varchar(10) であり、有効値は次のとおりです。重要 First トリガーと Last トリガーは、2 つの異なるトリガーである必要があります。
値
説明
First
トリガーは最初に起動されます。
Last
トリガーは最後に起動されます。
None
トリガーの起動順序は定義されません。
[ @stmttype= ] 'statement_type'
トリガーを起動する SQL ステートメントを指定します。statement_type のデータ型は varchar(50) です。INSERT、UPDATE、DELETE、LOGON、または「DDL イベント」に一覧表示されている任意の Transact-SQL ステートメント イベントを指定できます。イベント グループを指定することはできません。トリガーを特定のステートメントの種類に対する First または Last トリガーとして指定するには、そのトリガーをそのステートメントの種類に対するトリガーとして定義する必要があります。たとえば、テーブル T1 で、トリガー TR1 を INSERT に対する First トリガーとして指定するには、TR1 が INSERT トリガーとして定義されている必要があります。INSERT トリガーとしてのみ定義された TR1 を UPDATE ステートメントに対する First トリガーまたは Last トリガーとして設定すると、データベース エンジンはエラーを返します。詳細については、「解説」を参照してください。
@namespace= { 'DATABASE' | 'SERVER' | NULL }
triggername が DDL トリガーであるとき、triggername がデータベース スコープで作成されたのか、サーバー スコープで作成されたのかを指定します。triggername がログオン トリガーの場合は、SERVER を指定する必要があります。DDL トリガー スコープの詳細については、「DDL トリガの設計」を参照してください。指定されていない場合、または NULL が指定されている場合は、triggername は DML トリガーを示します。
リターン コードの値
0 (成功) または 1 (失敗)
説明
DML トリガー
1 つのテーブルでは、各ステートメントに対する First トリガーおよび Last トリガーはそれぞれ 1 つだけです。
テーブル、データベース、またはサーバーで、既に First トリガーが定義されている場合、同じテーブル、データベース、またはサーバーで、同じ statement_type に対して、First として新しいトリガーを指定することはできません。この制限は Last トリガーにも適用されます。
レプリケーションは、テーブルが即時更新サブスクリプションまたはキュー更新サブスクリプションに含まれる場合、自動的に最初のトリガーを生成します。レプリケーションのトリガーは最初のトリガーであることが必要です。レプリケーションでは、最初のトリガーを持つテーブルを即時更新サブスクリプションまたはキュー更新サブスクリプションに含めるよう設定すると、エラーが発生します。テーブルをサブスクリプションに含めた後、トリガーを最初のトリガーに設定すると、sp_settriggerorder はエラーを返します。レプリケーション トリガーに ALTER TRIGGER を使用したり、sp_settriggerorder を使用してレプリケーション トリガーを Last トリガーまたは None トリガーに変更したりすると、サブスクリプションは正しく動作しません。
DDL トリガー
データベース スコープが定義されている DDL トリガーとサーバー スコープが定義されている DDL トリガーが同じイベント上に存在する場合は、両方のトリガーを First トリガーまたは Last トリガーに指定できます。ただし、サーバー スコープのトリガーは常に最初のトリガーになります。通常、同一イベント上に存在する DDL トリガーの実行順序は次のようになります。
First マークが付けられたサーバー レベル トリガー。
その他のサーバー レベル トリガー。
Last マークが付けられたサーバー レベル トリガー。
First マークが付けられたデータベース レベル トリガー。
その他のデータベース レベル トリガー。
Last マークが付けられたデータベース レベル トリガー。
トリガーについての留意事項
ALTER TRIGGER ステートメントが最初または最後のトリガーを変更すると、そのトリガーに設定されていた First または Last 属性は削除され、値が None で置き換えられます。sp_settriggerorder を使用して順序の値を再設定する必要があります。
同じトリガーを複数のステートメントの種類に対する最初または最後のトリガーとして指定する必要がある場合は、ステートメントの種類ごとに sp_settriggerorder を実行する必要があります。また、トリガーを特定のステートメントの種類に対して起動される First または Last トリガーとして指定するには、最初にそのトリガーをそのステートメントの種類に対して定義する必要があります。
権限
サーバー スコープ (ON ALL SERVER で作成) で定義されている DDL トリガーまたはログオン トリガーの順序を設定するには、CONTROL SERVER 権限が必要です。
データベース スコープ (ON DATABASE で作成) で DDL トリガーの順序を設定するには、ALTER ANY DATABASE DDL TRIGGER 権限が必要です。
DML トリガーの順序を設定するには、そのトリガーが定義されているテーブルまたはビューに対する ALTER 権限が必要です。
例
A. DML トリガーの起動順序を設定する
次の例では、トリガー uSalesOrderHeader が、Sales.SalesOrderHeader テーブルで UPDATE 操作の発生後、最初に起動されるトリガーとなるよう指定しています。
USE AdventureWorks2008R2;
GO
sp_settriggerorder @triggername= 'Sales.uSalesOrderHeader', @order='First', @stmttype = 'UPDATE';
B. DDL トリガーの起動順序を設定する
次の例では、トリガー ddlDatabaseTriggerLog が、AdventureWorks2008R2 データベースで ALTER_TABLE イベントの発生後、最初に起動されるトリガーとなるよう指定します。
USE AdventureWorks2008R2;
GO
sp_settriggerorder @triggername= 'ddlDatabaseTriggerLog', @order='First', @stmttype = 'ALTER_TABLE', @namespace = 'DATABASE';