sp_settriggerorder (Transact-SQL)

最初または最後に起動される AFTER トリガを指定します。最初と最後のトリガの間で起動される AFTER トリガは、任意の順序で実行されます。

トピック リンク アイコンTransact-SQL 構文表記規則

構文

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

    トリガは最後に起動されます。

    なし

    トリガの起動順序は定義されません。

  • [ @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 トリガの実行順序は次のようになります。

  1. First マークが付けられたサーバー レベル トリガ。

  2. その他のサーバー レベル トリガ。

  3. Last マークが付けられたサーバー レベル トリガ。

  4. First マークが付けられたデータベース レベル トリガ。

  5. その他のデータベース レベル トリガ。

  6. 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 AdventureWorks;
GO
sp_settriggerorder @triggername= 'Sales.uSalesOrderHeader', @order='First', @stmttype = 'UPDATE';

B. DDL トリガの起動順序を設定する

次の例では、トリガ ddlDatabaseTriggerLog が、AdventureWorks データベースで ALTER_TABLE イベントの発生後、最初に起動されるトリガとなるよう指定します。

USE AdventureWorks;
GO
sp_settriggerorder @triggername= 'ddlDatabaseTriggerLog', @order='First', @stmttype = 'ALTER_TABLE', @namespace = 'DATABASE';