2016-05-13 5 views
0

システムで見つかった2人の人物を同じ名前でマージするかなり大きなストアドプロシージャがあります。これは、多くの異なるテーブル(約10程度、非常に異なるテーブルすべて)の削除と更新を行います。すべてがトランザクションにラップされ、失敗した場合はロールバックされます。これは間違った質問かもしれませんが、何か起こったことを正確に追跡する多くの "履歴"テーブルを作成したり挿入したりすることなく、この特定のトランザクションだけを保存してロールバックすることは可能ですか?私は、データベース全体、ストアドプロシージャ固有のトランザクションの結果、および後で復元する必要はありません。特定の古いSQLトランザクションをロールバックする

+0

テーブル全体を復元することは望ましくないことに注意してください。トランザクションの影響を受けたレコードだけです。 – Andy

答えて

0

Change Data Captureを調査しているようです。

データが変更されてもキャプチャされますが、1回の実行または非常に少量のデータに対してのみデータをキャプチャしている場合は、他の方法が有効です。

+0

ありがとう、間違いなくこれを読むつもりです。一見したがっているように聞こえて、これが特徴であることは知らなかった...。 :) – Andy

0

トランザクションがコミットされると、後でそのトランザクションだけをロールバックすることはできません。あなたはかなり文字通りの意味で「約束」しています。あなたは明らかにバックアップから復元し、特定の時点からすべてのトランザクションをロールバックすることができますが、それはおそらくあなたが探しているものではありません。

監査テーブルを作成することは、あなたの唯一の選択肢です。別の回答が示すように、データ変更のキャプチャを使用することもできますが、エンタープライズ版の大きな資金を使い切っていない限り、これはオプションではありません。しかし、この特定のタイプの変更を取り消すことに興味があるのであれば、再分割して実際の分割を行うために必要なデータレコードを格納するマージを行うコードをプロシージャに追加するのが最も簡単でしょう。しかし、スプリットを実行する能力を損なう可能性のある「マージされた」データへの変更を処理する必要があることに注意する必要があります。これは、SQLが自動的にあなたのためにそれを行うことができない理由です...元のトランザクションの後に発生する可能性のあるデータの変更をどのように処理したいか分かりません。

+0

私はスタンダード版しか持っていないようですので、CDCは私にとってはうまくいかないでしょう。面白いことではありませんが、現時点で監査テーブルは私の唯一の選択肢です。私は、各テーブルのスキーマコピーを後で元に戻す変更...またはテーブル、キー、フィールド、古い/新しい値、および実行された操作を保持するテーブルから削除/更新することを検討しています。いずれにしても、私はCDCについて学びました。エンタープライズエディションとチェンジトラッキングのためだけであり、それが私にとってはうまくいかないのです。 – Andy

関連する問題