4

データベーステーブルに行が挿入されるときに実行する必要のあるSQLコードを記述しているので、AFTERINSERTトリガーを使用しています。コードは非常に複雑であるため、まだいくつかのバグが存在する可能性があります。

トリガーの実行中にエラーが発生した場合、SQLServerはバッチまたはトランザクション全体(あるいはその両方)を中止することを発見しました。これは、データベースを使用するメインアプリケーションに問題を引き起こすため、私には受け入れられません。また、そのアプリケーションのソースコードがないため、適切なデバッグを実行できません。トリガーが失敗した場合でも、成功するにはすべてのデータベースアクションが絶対に必要です。

エラーが発生した場合にSQLServerがINSERTアクションを中止しないように、トリガーをコーディングするにはどうすればよいですか?

さらに、トリガーが失敗したことを実際に知ることができるように、適切なエラー処理を実行するにはどうすればよいですか?エラーデータを含む電子メールを送信することは私にとっては問題ありませんが(トリガーの主な目的は実際に電子メールを送信することです)、トリガーのエラー状態を検出してそれに対応するにはどうすればよいですか?


編集:

トリガー以外のものを使用してパフォーマンスを最適化するためのヒントをありがとうございますが、このコードは、実行時間が長く、パフォーマンスが集中するという意味で「複雑」ではありません。メールメッセージを作成して送信するだけですが、そのためには、さまざまなリンクテーブルからデータを取得する必要があります。このアプリケーションをリバースエンジニアリングしているため、データベーススキーマが利用できず、検索を試みています。それを回避する方法。これが、変換エラーまたは予期しない/ null値がまだ忍び寄り、トリガーの実行をクラッシュさせる可能性がある理由です。

また、前述のように、アプリケーション自体でデバッグを実行したり、アプリケーション層で必要なことを実行するように変更したりすることは絶対にできません。アプリケーションイベントに対応する唯一の方法は、アプリケーションがDBに書き込みを行ったときに、データベーストリガーを起動して、何かが発生したことを通知することです。

4

2 に答える 2

2

トリガー内の操作が複雑で長時間実行される可能性があり、アクティビティが元のトランザクションに影響を与えたくない場合は、アクティビティを分離する方法を見つける必要があります。

1 つの方法は、 Service Brokerを使用することです。トリガーでは、メッセージ (行ごとに 1 つ) を作成して途中で送信し、サービスで残りの処理を行います。

それが複雑すぎると思われる場合は、処理が必要な行を作業/キュー テーブルに挿入し、そこから継続的に行をプルするジョブを実行するという古い方法があります。

いずれにせよ、元のトランザクションのコミットを妨げていません。

于 2012-05-05T15:02:13.103 に答える
0

トリガーはトランザクションの一部です。トリガーコードの周りでキャッチスワローを試すか、もう少し専門的にキャッチログスワローを試すこともできますが、実際には、トリガーにのみ発生する可能性のある実際の問題を修正する必要があります。上記のいずれも受け入れられない場合は、トリガーを使用できません。

于 2012-05-05T14:45:04.727 に答える