質問
挿入物にトリガーがありますが、トリガーが失敗した場合、挿入も失敗します。
トリガーが失敗しても、挿入を続行させる方法はありますか?
編集:新しいレコードが入力されたときにトリガーを使用してメールを送信します。メールが送信されたかどうかに関係なく、レコードを保存したいです。
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にメールしてください