33

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

ありがとう。

4

10 に答える 10

18

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

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

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

于 2008-09-18T16:56:56.050 に答える
16

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

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

于 2008-09-18T18:04:05.703 に答える
12

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

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

于 2008-09-18T16:49:10.390 に答える
6

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

于 2008-09-18T16:33:44.903 に答える
4

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

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

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

  1. 最初–トリガーが最初に起動されます
  2. 最後-トリガーは最後に起動されます
  3. なし–トリガーはランダムな順序で発生します。
于 2008-09-18T16:28:29.690 に答える
4

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

ここから抜粋したサンプルを次に示します(リンクされた記事には、より多くの情報があります)。

sp_settriggerorder [ @triggername = ] ‘[ triggerschema. ] triggername’
, [ @order = ] ‘value’
, [ @stmttype = ] ’statement_type’
[ , [ @namespace = ] { ‘DATABASE’ | ‘SERVER’ | NULL } ]
于 2008-09-18T16:34:52.327 に答える
2

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

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

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

于 2008-09-18T16:28:20.580 に答える
1

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

sp_settriggerorder[@triggername = ] 'triggername', [@order = ] 'value', [@stmttype = ] 'statement_type'
于 2008-09-18T16:28:44.027 に答える