2009-06-09 14 views
0

これは可能ではないかもしれないと感じましたが、ここに行きます...トランザクションを失敗させることなく、SQLトリガーのハンドルエラー?

私はそれに挿入トリガを持っているテーブルを持っています。データがこのテーブルに挿入されると、トリガーが起動して長いvarbinary列を解析します。このトリガーは、バイナリ・データに対していくつかの操作を実行し、複数のエントリを2番目の表に書き込みます。

私が最近発見したことは、バイナリデータが「正しい」ものではないことです(つまり、これは何の制御もしていません)。キャストエラーなどが発生する可能性があります。

私の最初の反応は、TRY/CATCHブロックで物を包むことでしたが、CATCHの実行によってトランザクションが破棄され、「トリガで破棄されたトランザクション」エラーが発生するため、解決策ではないようです。

データがまだ最初のテーブルに書き込まれていることは必須ではありません。データが2番目のテーブルに書き込まれるかどうかは気にしません。

これを達成できるかどうかはわかりませんが、喜んでアドバイスを受け取ります。

答えて

1

あなたができることは、トリガー内でトランザクションをコミットしてからキャストを実行することです。 それはあなたの問題の可能な解決策であるかどうかわかりません。

別のオプションは、列の値をチェックする関数IsYourBinaryValueOKを作成することです。しかし、チェックはエラーを起こさないようにする必要があります。

+0

価値があるショット、アイデアのおかげで。 – Valerion

+0

はい、このアイデアはうまくいきました - それぞれの文字が '1'、 '2'、 '3'などであるかどうかを調べるための少しの機能 - いずれの時点でも0を返す場合は0を返しますキャストの結果を返します。仕事をうまくやっているようだ! – Valerion

+0

@Valerion - IsNumeric()関数を見たいかもしれませんが、あなたの必要にあまりにも鈍いかもしれません。 – ahains

1

概念的には2つの異なるトランザクションであるため、このコードは挿入トリガーで実行する必要があります。おそらく、サービスブローカー、「完了していない」作業などを探すバックナンバーのタスクなどの非同期処理のほうがよいでしょう。また、sprocを使用して1つのトランザクションで挿入を行い、それを呼び出すことでそれを処理することもできますそれ以降のdo-other-workコード。

トリガーで絶対に行う必要がある場合は、基本的に自律型トランザクションが必要です。いくつかのアイデアについてはthis linkを参照してください(テクニックはSQL 2005にも適用されます)。

+0

良いリンクと面白い読書、私は他の答えに行ってきましたが。おそらくトリガーは厳密には最善ではないが、システムの残りの部分と概念的にはよく合っており、管理が容易であると考えている。最後に関数を使用することで、私は実際にエラーを避けていましたが、最初にそれを回避しようとするよりも優れていると思っています。 – Valerion

関連する問題