2016-12-12 5 views
0

SQL文からROLLBACKへのコミットを監査するCOMMITへの挿入

私はマスターストアのprocを持っています。これはいくつかの '子'のストアドプロシージャを呼び出します。 マスターprocは、子procsをトランザクション内にカプセル化します。

マスターと子プロキシ全体で、監査テーブルには多くの挿入があります。

処理が正常に終了すると、一連のイベントが検出されます。プロセスが失敗してロールバックされた場合、監査テーブルで処理された最後の子プロセスのレコードを取得したいが、全体が監査データを含めてロールバックされる。子プロセスの変更をロールバックしながら、監査挿入を選択的にコミットする方法はありますか?

ありがとうございました

答えて

3

これはかなり「ノー」です。トランザクション内のテーブルで行われたすべての作業(挿入、更新、削除)は、すべてまたは無です。

手作業による選択肢は、処理中のデータを1つ以上の変数で追跡し、プロシージャ間で前後に渡すことです。すべてがコミットされている場合は、変数を無視します。ロールバックする必要がある場合は、そのデータを保持したいデータを掘り下げることができます。

+1

これを行うには非常に面倒ですが機能的な方法の1つは、監査ログを更新するすべてのSQL文をvarchar(max)@variableに順番に実行しながら保存することです。プロセスが失敗してロールバックすると、変数内のSQLとエラー追跡データ内の情報によってどこが失敗したかを確認し、ログを適切に更新できます。これにより、ロールバックされたログされた情報必要なデータそのクルージングと恐ろしい痛みですが、それはうまく実装されたときに正確です。 –

3

マスタープロシージャで表変数を使用し、各子プロシージャのリターンコードを表変数に挿入できます。テーブル変数はトランザクションの影響を受けませんが、テンポラリテーブルは影響を受けません。

マスタープロシージャの最後で、テーブル変数から選択して、子プロシージャの結果を返すことができます。

関連する問題