sp_settriggerorder (Transact-SQL)

適用対象:SQL ServerAzure SQL DatabaseAzure 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'

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

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

重要

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

[ @stmttype = ] 'stmttype'

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

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

@namespace= { 'DATABA Standard Edition' |'Standard Edition RVER' |NULL }

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

リターン コードの値

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

解説

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

DML トリガー

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

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

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

DDL トリガー

データベース スコープを持つ DDL トリガーとサーバー スコープを持つ DDL トリガーが同じイベントに存在する場合は、両方のトリガーがトリガーまたはLastトリガーであることをFirst指定できます。 ただし、サーバー スコープのトリガーは常に最初に起動します。 一般に、同じイベントに存在する DDL トリガーの実行順序は次のとおりです。

  1. マークされたサーバー レベルのトリガー First
  2. その他のサーバー レベルのトリガー
  3. マークされたサーバー レベルのトリガー Last
  4. マークされたデータベース レベルのトリガー First
  5. その他のデータベース レベルのトリガー
  6. マークされたデータベース レベルのトリガー Last

トリガーに関する一般的な考慮事項

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

複数のステートメント型の最初または最後の順序として同じトリガーを指定する必要がある場合は、 sp_settriggerorder ステートメントの種類ごとに実行する必要があります。 また、そのトリガーは、そのステートメントの種類に対して起動するトリガーLastとしてFirst指定する前に、ステートメントの種類に対して最初に定義する必要があります。

アクセス許可

サーバー スコープ (作成 ON ALL SERVER) またはログオン トリガーを使用して DDL トリガーの順序を設定するには、アクセス許可が必要 CONTROL SERVER です。

データベース スコープ (作成 ON DATABASE) を使用して DDL トリガーの順序を設定するには、アクセス許可が必要 ALTER ANY DATABASE DDL TRIGGER です。

DML トリガーの順序を設定するには、トリガーが定義されているテーブルまたはビューに対するアクセス許可が必要 ALTER です。

A. DML トリガーの起動順序を設定する

次の例では、トリガー uSalesOrderHeader がテーブルで操作が発生した後に起動する UPDATE 最初の Sales.SalesOrderHeader トリガーであることを指定します。

USE AdventureWorks2022;
GO

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

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

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

USE AdventureWorks2022;
GO

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