次の方法で共有


sp_settriggerorder (Transact-SQL)

更新 : 2006 年 12 月 12 日

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

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

構文

sp_settriggerorder [ @triggername = ] '[ triggerschema. ] triggername' 
        , [ @order = ] 'value' 
        , [ @stmttype = ] 'statement_type' 
        [ , [ @namespace = ] { 'DATABASE' | 'SERVER' | NULL } ]

引数

  • [ @triggername= ] '[ triggerschema**.****] triggername**'**
    順序を設定または変更するトリガの名前と、(該当する場合は) そのトリガが属するスキーマを指定します。[triggerschema**.**]triggernamesysname です。名前がトリガに対応していない場合、または名前が INSTEAD OF トリガに対応している場合は、エラーが返されます。triggerschema は、DDL トリガおよびログオン トリガに対しては指定できません。
  • [ @order= ] 'value'
    新しいトリガ順序の設定です。valuevarchar(10) であり、有効値は次のとおりです。

    ms186762.note(ja-jp,SQL.90).gif重要 :
    First トリガと Last トリガは、2 つの異なるトリガである必要があります。
    説明

    First

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

    Last

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

    なし

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

  • [ @stmttype= ] 'statement_type'
    トリガを起動する SQL ステートメントを指定します。statement_type のデータ型は varchar(50) です。INSERT、UPDATE、DELETE、LOGON、または「DDL トリガに使用される DDL イベント」に一覧表示されている任意の Transact-SQL ステートメント イベントを指定できます。イベント グループを指定することはできません。

    トリガを特定のステートメントの種類に対する First または Last トリガとして指定するには、そのトリガをそのステートメントの種類に対するトリガとして定義する必要があります。たとえば、テーブル T1 で、トリガ TR1 を INSERT に対する First トリガとして指定するには、TR1 が INSERT トリガとして定義されている必要があります。INSERT トリガとしてのみ定義された TR1 を UPDATE ステートメントに対する First トリガまたは Last トリガとして設定すると、SQL Server 2005 データベース エンジンはエラーを返します。詳細については、「解説」を参照してください。

  • @namespace= { 'DATABASE' | 'SERVER' | NULL }
    triggername が DDL トリガまたはログオン トリガであるとき、triggername がデータベース スコープで作成されたのか、サーバー スコープで作成されたのかを指定します。ログオン トリガはサーバー スコープのみで作成できます。DDL トリガ スコープの詳細については、「DDL トリガの設計」を参照してください。指定されていない場合、または NULL が指定されている場合は、triggername は DML トリガを示します。

解説

1 つのテーブルでは、各ステートメントに対する First トリガおよび Last トリガはそれぞれ 1 つだけです。

テーブル、データベース、またはサーバーで、既に First トリガが定義されている場合、同じテーブル、データベース、またはサーバーで、同じ statement_type に対して、First として新しいトリガを指定することはできません。この制限は Last トリガにも適用されます。

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

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 権限が必要です。

戻り値

成功した場合は 0 を、失敗した場合は 1 をそれぞれ返します。

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';

参照

関連項目

システム ストアド プロシージャ (Transact-SQL)
データベース エンジンのストアド プロシージャ (Transact-SQL)
ALTER TRIGGER (Transact-SQL)

ヘルプおよび情報

SQL Server 2005 の参考資料の入手

変更履歴

リリース 履歴

2006 年 12 月 12 日

新しい内容 :
  • SQL Server 2005 Service Pack 2 で導入されたログオン トリガの情報を全面的に追加しました。