質問

挿入物にトリガーがありますが、トリガーが失敗した場合、挿入も失敗します。

トリガーが失敗しても、挿入を続行させる方法はありますか?

編集:新しいレコードが入力されたときにトリガーを使用してメールを送信します。メールが送信されたかどうかに関係なく、レコードを保存したいです。

SPからそれをどのように行いますか?

役に立ちましたか?

解決

いいえ

  • トリガーはトランザクションの一部です
  • エラーは挿入ステートメントを中止します(明示的なトランザクションではない場合)
  • トリガーのエラーはトランザクションを運命づけます(つまり、ロールバックする必要があります)
  • トライ/キャッチブロックがあるトリガーのエラー いいえ 使用済み(挿入の周りにも)はバッチを中止します

トリガーを使用しないでください。代わりにストアドプロシージャを使用して、挿入物からロジックを分離します。

個人的には、トリガーの失敗は、いくつかの複雑なDRIが失敗したか、歴史のテーブルに書くことができないことを意味します。それは悪いことです...

編集:

  • サービスブローカーを使用して、トリガーから通知を送信します。
  • 別のコードがそれを拾い上げて非同期に送信します

私は自分自身を実装していないので、私はあなたを紹介しなければなりません グーグル

他のヒント

サービスブローカーに満足していない場合でも、トリガーを使用できますが、電子メールを送信する代わりに、電子メールの内容を何らかの電子メールテーブルに挿入します。次に、そのテーブルを定期的にチェックし、電子メールを個別に処理し、送信時にキューから削除する非同期プロセスがあります。

メールの生成をメールで送信すると、挿入物が失敗するのが防止され、新しいメールをキャプチャしながらメールの問題をトラブルシューティングすることができます。

はい

トリガーは、通常の命令、ヌル値などで失敗します

::挿入トリガーの開始を挿入する代わりに使用します

挿入から#inestedに選択します

declare @query nvarchar(max)、 @iretval int

::各命令をクエリに構築することで失敗をバイパスできます

@query = n'update ...などを設定します '

:: sp_executesqlの前にクエリをチェックすることもお勧めします。

@queryがnullの場合begin @iretval = 999 goto last end

::それから

exec @iretval = sp_executesql @query [[parmameters] outvalue] @iretval> 0 goto last

::挿入物は、トリガーが機能した場合に旗か何かを表示する必要があります。

最後

@iretval = 0 update #inested set flag = ok

テーブルに挿入 * from #intertedを選択します

::ノート。各ステートメントを確認する必要があり、他のテーブルから値を取得する必要がある場合は、値が有効であり、isNullではなく確認してください。

例がある場合。 jhodgson@tsti.co.zaにメールしてください

ライセンス: CC-BY-SA帰属
所属していません dba.stackexchange
scroll top