sp_settriggerorder (Transact-SQL)
適用対象:SQL ServerAzure SQL DatabaseAzure 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)で、次のいずれかの値を指定できます。
Value | 説明 |
---|---|
First |
トリガーは最初に起動されます。 |
Last |
トリガーは最後に発生します。 |
None |
トリガーは未定義の順序で起動されます。 |
重要
トリガーとLast
トリガーはFirst
、2 つの異なるトリガーである必要があります。
[ @stmttype = ] 'stmttype'
トリガーを起動する Transact-SQL ステートメントを指定します。 @stmttypeは varchar(50)、DDL イベントにリストされている T-SQL ステートメント イベント、または任意の T-SQL ステートメント イベントを指定できますUPDATE
LOGON
DELETE
INSERT
。 イベント グループを指定できません。
トリガーは、そのトリガーがそのステートメント型のFirst
Last
トリガーとして定義された後にのみ、ステートメントの種類のトリガーとして指定できます。 たとえば、トリガーTR1
として定義されているFirst
INSERT
場合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 つのFirst
Last
トリガーしか存在できません。
First
テーブル、データベース、またはサーバーでトリガーが既に定義されている場合、同じ@stmttypeに対して同じテーブル、データベース、またはサーバーに対して新しいトリガーFirst
を指定することはできません。 この制限では、トリガーも適用されます Last
。
レプリケーションは、テーブルが即時更新サブスクリプションまたはキュー更新サブスクリプションに含まれる場合、自動的に最初のトリガーを生成します。 レプリケーションでは、そのトリガーが最初のトリガーである必要があります。 レプリケーションでは、最初のトリガーを持つテーブルを即時更新サブスクリプションまたはキュー更新サブスクリプションに含めるよう設定すると、エラーが発生します。 テーブルがサブスクリプションに含まれた後にトリガーを最初のトリガーにしようとすると、 sp_settriggerorder
エラーが返されます。 レプリケーション トリガーで使用ALTER TRIGGER
する場合、またはsp_settriggerorder
レプリケーション トリガーをトリガーに変更するLast
None
場合、サブスクリプションは正しく機能しません。
DDL トリガー
データベース スコープを持つ DDL トリガーとサーバー スコープを持つ DDL トリガーが同じイベントに存在する場合は、両方のトリガーがトリガーまたはLast
トリガーであることをFirst
指定できます。 ただし、サーバー スコープのトリガーは常に最初に起動します。 一般に、同じイベントに存在する DDL トリガーの実行順序は次のとおりです。
- マークされたサーバー レベルのトリガー
First
- その他のサーバー レベルのトリガー
- マークされたサーバー レベルのトリガー
Last
- マークされたデータベース レベルのトリガー
First
- その他のデータベース レベルのトリガー
- マークされたデータベース レベルのトリガー
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';
関連するコンテンツ
フィードバック
https://aka.ms/ContentUserFeedback」を参照してください。
以下は間もなく提供いたします。2024 年を通じて、コンテンツのフィードバック メカニズムとして GitHub の issue を段階的に廃止し、新しいフィードバック システムに置き換えます。 詳細については、「フィードバックの送信と表示