sp_settriggerorder (Transact-SQL)

適用対象: SQL Server Azure SQL Database Azure SQL Managed Instance

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

Transact-SQL 構文表記規則

構文

sp_settriggerorder
    [ @triggername = ] N'triggername'
    , [ @order = ] 'order'
    , [ @stmttype = ] 'stmttype'
    [ , [ @namespace = ] 'DATABASE' | 'SERVER' | NULL ]
[ ; ]

引数

[ @triggername = ] N'triggername'

トリガーの名前と、それが属するスキーマ (該当する場合)、その順序が設定または変更されます。 @triggername は既定値なしで nvarchar(517)であり、 [ trigger_schema ] trigger_name形式です。 名前がトリガーに対応していない場合、または名前が INSTEAD OF トリガーに対応する場合、プロシージャはエラーを返します。 DDL トリガーまたはログオン トリガーにスキーマを指定することはできません。

[ @order = ] 'order'

トリガーの新しい順序の設定。 @ordervarchar(10)であり、次のいずれかの値を指定できます。

Value 説明
First トリガーは最初に起動されます。
Last トリガーは最後に発生します。
None トリガーは未定義の順序で起動されます。

重要

FirstトリガーとLast トリガーは、2 つの異なるトリガーである必要があります。

[ @stmttype = ] 'stmttype'

トリガーを起動する Transact-SQL ステートメントを指定します。 @stmttypevarchar(50)であり、 INSERTUPDATEDELETELOGON、または DDL イベントにリストされている任意の T-SQL ステートメント イベントを指定できます。 イベント グループを指定できません。

トリガーは、そのトリガーがそのステートメント型のトリガーとして定義された後にのみ、ステートメント型の First または Last トリガーとして指定できます。 たとえば、TR1INSERT トリガーとして定義されている場合、テーブル T1INSERTのトリガー TR1First指定できます。 INSERT トリガーとしてのみ定義されたTR1が、UPDATE ステートメントのFirstまたはLastトリガーとして設定されている場合、データベース エンジンはエラーを返します。 詳細については、「解説」を参照してください。

@namespace = { 'DATABASE' |'SERVER' |NULL }

@triggernameが DDL トリガーの場合、@namespaceはデータベース スコープとサーバー スコープのどちらを使用して@triggernameが作成されたかを指定します。 @triggernameがログオン トリガーの場合は、SERVERを指定する必要があります。 DDL トリガー スコープの詳細については、「 DDL トリガー」を参照してください。 指定しない場合、または NULL が指定されている場合、 @triggername は DML トリガーです。

リターン コードの値

0 (成功) と 1 (失敗)。

解説

このセクションでは、データ操作言語 (DML) トリガーとデータ定義言語 (DDL) トリガーに関する考慮事項について説明します。

DML トリガー

1 つのテーブルのステートメントごとに 1 つの First と 1 つの Last トリガーしか存在できません。

テーブル、データベース、またはサーバーで First トリガーが既に定義されている場合、同じ@stmttypeの同じテーブル、データベース、またはサーバーの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 AdventureWorks2022;
GO

EXEC sp_settriggerorder @triggername = 'Sales.uSalesOrderHeader',
    @order = 'First',
    @stmttype = 'UPDATE';

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

次の例では、AdventureWorks2022 データベースでALTER_TABLE イベントが発生した後にトリガー ddlDatabaseTriggerLogが最初に発生することを指定します。

USE AdventureWorks2022;
GO

EXEC sp_settriggerorder @triggername = 'ddlDatabaseTriggerLog',
    @order = 'First',
    @stmttype = 'ALTER_TABLE',
    @namespace = 'DATABASE';