web-dev-qa-db-ja.com

SQLServerトリガー-実行順序

SQL Serverが(同じタイプの、つまりトリガーの前に)順序トリガーを決定する方法を知っている人はいますか?そして、私が望む順序を指定できるようにこれを変更する方法はありますか?そうでない場合は、なぜですか。

ありがとう。

30
HAdes

SetTriggerOrderの使用は問題ありませんが、コードが特定の実行シーケンスに依存している場合は、すべてのトリガーをストアドプロシージャにラップし、最初のトリガーで2番目の呼び出し、2番目の呼び出しで3番目の呼び出しなどを実行してください。

次に、最初の1つをトリガーで実行するだけです。

将来の誰かは、カスタム実行シーケンスを決定するためにシステムテーブルを掘り下げる必要がなかったことに感謝するでしょう。

18
JosephStyons

sp_settriggerorder を使用して、テーブルの各トリガーの順序を定義できます。

ただし、複数のことを実行する単一のトリガーを使用する方がはるかに良いと思います。これは特になので、順序が重要な場合、複数のトリガーがある場合、その重要性はあまり明白ではないためです。誰かがデータベースを数か月/数年先にサポートしようとしていると想像してみてください。もちろん、複数のトリガーが必要な場合や、実際にはより優れた設計である場合もありますが、トリガーを1つ用意して、そこから作業する必要があると想定し始めます。

14
Rory

トリガーの注文について心配している場合は、実際に一歩後退して、何をしようとしているのか、そしてそれを行うためのより良い方法があるかどうかを検討する必要があります。これを変更するのは簡単ではないという事実は、あなたに何かを伝えているはずです。

トリガーは常に本物のきちんとしたソリューションのように見え、適切な場所で非常に価値がありますしかし価格が高いので、トリガーを使用してデバッグの悪夢を作成するのは本当に簡単です。私は過去に何時間も失われ、データベースのあいまいな動作をデバッグしようとして、見落とされたトリガーに原因が潜んでいることを発見しました。

11
Cruachan

sp_settriggerorderは、AFTERトリガーにのみ適用されます。

5
Luke Bennett

Sp_settriggerorderを使用すると、どのトリガーが最初に起動され、どのトリガーが最後に起動され、どのトリガーが途中で起動されるかを保証できます。 3つ以上を同期する必要がある場合、SQL Server2005では同期できないようです。

これは ここ から取られたサンプルです(リンクされた記事にはもっと多くの情報があります)。

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

使用する sp_Settriggerorderストアドプロシージャでは、トリガーの実行順序を定義できます。

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

2番目のパラメーター「order」は3つの値を取ることができます。これは、最大3つのトリガーを考慮に入れることができることを意味します。

  1. 最初–トリガーが最初に起動されます
  2. 最後-トリガーは最後に起動されます
  3. なし–トリガーはランダムな順序で起動されます。
4
EvilEddie

順序はSQLサーバーによって設定されます。実行できるのは、システムsp(sp_settriggerorder)を使用して、最初に起動するトリガーと最後に起動するトリガーを設定することだけです。

最初と最後のトリガーを起動するように設定する以外に、SQLサーバーが使用する順序を変更または指示することはできません。したがって、トリガーが起動される順序に依存しないようにトリガーを作成する必要があります。彼らが今日発砲する順番を決めたとしても、それは明日変わるかもしれません。

この情報はSQLServer 2000に基づいていますが、この点で2005/2008の動作が異なるとは思いません。

2
Dave_H

これを使って :

例えば ​​:

USE AdventureWorks;
GO
EXEC sys.sp_settriggerorder @triggername = N'', -- nvarchar(517)
    @order = '', -- varchar(10)
    @stmttype = '', -- varchar(50)
    @namespace = '' -- varchar(10)

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

最初:トリガーが最初に起動されます。

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

なし:トリガーは未定義の順序で起動されます。

そして、@stmttypeの値についてはこのリンクを参照してください: DDLイベント

そして@ namespace = {'DATABASE' | 'サーバー' | NULL}および詳細については、以下を参照してください: DDLトリガー

2

この文脈での百万ドルの声明-

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

ソース: [〜#〜] msdn [〜#〜]

1
Akshay

このシステムストアドプロシージャを使用します。

sp_settriggerorder[@triggername = ] 'triggername', [@order = ] 'value', [@stmttype = ] 'statement_type'
1
Ben Hoffstein