0
私のストアドプロシージャの1つに問題があります。ロールバック後にN-deepログを持続する
私はrecursiveChildren
自分自身を呼び出すトランザクションを呼び出して、main
プロシージャを実行します。このような
何か:
EXEC main
{
EXEC log 'START'
BEGIN TRANSACTION
BEGIN TRY
EXEC recursiveChildren
{
IF ...
EXEC recursiveChildren
{
IF ...
EXEC recursiveChildren
{
...
}
END IF
EXEC log 'step X'
}
END IF
EXEC log 'step X'
}
IF ...
COMMIT;
ELSE
THROW error;
END TRY
BEGIN CATCH
ROLLBACK;
EXEC log 'ROLLBACK'
END CATCH
END TRANSACTION
EXEC log 'STOP'
}
あなたが見ることができるように、私は私がやっているものに追跡するためにログプロシージャを呼び出すが、私は私のTHROW error
を使用する必要がある場合、私はすべての情報を失いますよ何が起こったかについて
ログとロールバックについてはTSQL logging inside transactionと書かれていますが、table variable
はプロシージャのパラメータとして使用されたときにはREADONLY
であるため、再帰には適していません。
ロールバックするたびにログを保存するにはどうすればよいですか?
:誰かが同じ問題に直面している場合はここ
はコードです。唯一の例外は、ログ変数を保持するためにテーブル変数を使用したが、独自の課題である再帰を使用しているためです。このためには、テーブル値のパラメータを何度も渡す必要があります。あなたがしなければならないことは、各反復で同じデータ型のローカルインスタンスを作成し、渡されたパラメータで満たすことです。次に、再帰時に新しいローカルバージョンを渡します。維持するのは醜い悪夢です。 –
@SeanLangeはい私はトランザクション処理の仕組みにかなり精通していますが、ロールバックはロジックの一部であり、「なぜロールバックするのか」も必須です。だから私は選択肢がありません。 readonlyにあるように 'table variable'を再帰的に使用しても、私は子供のログを親に戻すことができません(技術的には、プロシージャからデータを抽出するために使用することはできません)。 – Blag
外側のスコープのエラーハンドラでロールバックされた質問のように構造化されている場合は、一時テーブルを使用して、ロールバックを実行する前に内容をテーブル変数にコピーすることができます。 –