SQL Serverが(同じタイプの、つまりトリガーの前に)順序トリガーが実行されることをどのように決定するかを知っている人はいますか?そして、私が望む順序を指定できるようにこれを変更する方法はありますか?そうでない場合は、なぜですか。
ありがとう。
SQL Serverが(同じタイプの、つまりトリガーの前に)順序トリガーが実行されることをどのように決定するかを知っている人はいますか?そして、私が望む順序を指定できるようにこれを変更する方法はありますか?そうでない場合は、なぜですか。
ありがとう。
SetTriggerOrder を使用することは問題ありませんが、コードが特定の実行シーケンスに依存している場合は、すべてのトリガーをストアド プロシージャにラップして、最初のトリガーで 2 番目を呼び出し、2 番目で 3 番目を呼び出すというようにします。
次に、トリガーで最初のものを実行するだけです。
将来、カスタムの実行シーケンスを決定するためにシステム テーブルを掘り下げる必要がなくなったことに感謝する人がいるでしょう。
sp_settriggerorderを使用して、テーブルの各トリガーの順序を定義できます。
ただし、複数のことを行う単一のトリガーを使用する方がはるかに優れていると思います。複数のトリガーがある場合、その重要性はあまり明白ではないため、順序が重要な場合は特にそうです。誰かが何ヶ月も何年もかけてデータベースをサポートしようとしていると想像してみてください。もちろん、複数のトリガーが必要な場合や、実際にはより優れた設計の場合もありますが、トリガーを 1 つ用意してそこから作業する必要があると想定し始めます。
トリガーオーダーについて心配している場合は、一歩下がって、何をしようとしているのか、より良い方法があるかどうかを検討する必要があります。これを変えるのは簡単なことではないという事実は、あなたに何かを伝えているはずです。
トリガーは常に非常に優れたソリューションのように見え、適切な場所では非常に価値がありますが、価格が高く、デバッグの悪夢を簡単に作成できます。過去に、データベースのあいまいな動作をデバッグしようとして何時間も無駄にしましたが、見過ごされたトリガーに原因が潜んでいることがわかりました。
sp_settriggerorder は AFTER トリガーにのみ適用されます。
ストアドプロシージャを使用sp_Settriggerorder
すると、トリガーの実行順序を定義できます。
sp_settriggerorder [ @triggername = ] ‘[ triggerschema. ] triggername’
, [ @order = ] ‘value’
, [ @stmttype = ] ’statement_type’
[ , [ @namespace = ] { ‘DATABASE’ | ‘SERVER’ | NULL } ]
2番目のパラメーター「order」は3つの値を取ることができます。これは、最大3つのトリガーを考慮に入れることができることを意味します。
sp_settriggerorder を使用して、どのトリガーが最初に起動され、どのトリガーが最後に起動され、どのトリガーが途中で起動されるかを保証できます。3 つ以上を同期する必要がある場合、SQL Server 2005 では可能ではないようです。
ここから抜粋したサンプルを次に示します(リンクされた記事には、より多くの情報があります)。
sp_settriggerorder [ @triggername = ] ‘[ triggerschema. ] triggername’
, [ @order = ] ‘value’
, [ @stmttype = ] ’statement_type’
[ , [ @namespace = ] { ‘DATABASE’ | ‘SERVER’ | NULL } ]
順序はSQLサーバーによって設定されます。実行できるのは、システムsp(sp_settriggerorder)を使用して、最初に起動するトリガーと最後に起動するトリガーを設定することだけです。
最初と最後のトリガーを起動するように設定する以外に、SQLサーバーが使用する順序を変更または指示することはできません。したがって、トリガーが起動される順序に依存しないようにトリガーを作成する必要があります。彼らが今日発砲する順番を決めても、明日変わるかもしれません。
この情報はSQLServer2000に基づいていますが、この点で2005/2008の動作が異なるとは思いません。
このシステムストアドプロシージャを使用します。
sp_settriggerorder[@triggername = ] 'triggername', [@order = ] 'value', [@stmttype = ] 'statement_type'