sp_settriggerorder (Transact-SQL)
適用対象: SQL Server Azure SQL Database Azure SQL Managed Instance
最初または最後に起動される AFTER
トリガーを指定します。 最初のトリガーと最後のトリガーの間で発生する AFTER
トリガーは、未定義の順序で実行されます。
構文
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)であり、次のいずれかの値を指定できます。
値 | 説明 |
---|---|
First |
トリガーは最初に起動されます。 |
Last |
トリガーは最後に発生します。 |
None |
トリガーは未定義の順序で起動されます。 |
重要
First
トリガーとLast
トリガーは、2 つの異なるトリガーである必要があります。
[ @stmttype = ] 'stmttype'
トリガーを起動する Transact-SQL ステートメントを指定します。 @stmttype は varchar(50)であり、 INSERT
、 UPDATE
、 DELETE
、 LOGON
、または DDL イベントにリストされている任意の T-SQL ステートメント イベントを指定できます。 イベント グループを指定できません。
トリガーは、そのトリガーがそのステートメント型のトリガーとして定義された後にのみ、ステートメント型の First
または Last
トリガーとして指定できます。 たとえば、TR1
がINSERT
トリガーとして定義されている場合、テーブル T1
でINSERT
のトリガー TR1
をFirst
指定できます。 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 トリガーの実行順序は次のとおりです。
- マークされたサーバー レベルのトリガー
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 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';