web-dev-qa-db-ja.com

制御された環境でデータベースに加えられたすべての変更を元に戻す方法は?

製品のシステムテストを行っていますが、いくつかのテストでデモデータベースのデータが大幅に変更されています。

データは、テストによって行われた変更を取り消すクエリを作成するために非常に複雑です。さらに、これらのテストは変更される可能性があります。

データベースの復元には30秒かかりますが、自動テストでは長すぎるため、バックアップ/復元を使用することはできません。

insert into selectの使用も複雑です。ここでも、テストは変更される可能性があり、現在影響を与えていないテーブルに影響を与える可能性があります。パフォーマンス上の理由から、この方法でデータベース全体をコピーすることもできません。

Microsoft SQL Serverにはスナップショット機能がありますが、ローカルホストにエンタープライズバージョンがないため、使用できません。システムテストには2つのアプリケーションが関与し、それらの間には複雑な相互作用があるため、トランザクションも使用できません。もちろん、それらは同じ接続を共有しません。

データベースの最後の変更をすばやく元に戻すにはどうすればよいですか?

問題を簡単にするために、

  1. データベースは制御された環境にあります。

    • ローカルホスト上にあるので、アクセスできるのは私だけです。

    • 唯一の変更は、システムテストによるものです。すべての変更が失われる可能性があります(また、失われる可能性があります)。

    • 任意の復旧モデルを選択できます。

  2. 準備(たとえば、ある種のバックアップ)は非常にまれにしか実行されないため、長時間かかる場合もあれば、手動の作業になる場合もあります。データベースに影響するすべてのテストの後で行われるため、重要なのはこの時点からの変更を元に戻す速度だけです。

4

これが開発/テストのみの場合は、Developer Editionのライセンスを取得できます(2014以降の場合は無料、2012年以下の場合は約50ドル)。 Developer EditionはEnterprise Editionでサポートされているすべての機能をサポートしているため、スナップショットを使用します。唯一の違いはライセンスです。本番環境ではDeveloper Editionを使用できません。

データベーススナップショットから復帰するよりもはるかに簡単または高速な処理を実行することはできません。しかし、いくつかの調査を行う- このようなことに注意したい

5
Aaron Bertrand

DBスナップショット を調べることをお勧めします。 (理論的には)(テストの結果をデータベースに書き込んだ後)最後にロールバックを使用して独自のトランザクションで各変更をラップしない限り、変更を元に戻す最も速い方法です。

テストのフレームワークに組み込む場合は、個々のテストをロールバックブロックにカプセル化すると、すべてのテスト後に環境に加えられたすべての変更が取り消されるため、うまくいく場合があります。これにより、相互に依存している自動テストを組み合わせることがより困難になります。

5
Sean Long

テストを「テーマにした」セクションに分割し、各セクションは独自のトランザクションを取得します。これは、制御されたデータでテストの次のセクションを実行できるようにロールバックされます。

テスト自体にはトランザクション制御がありません。これにより、選択したテストが独自のトランザクションを使用して別のセクションで実行される、より多くのテストシナリオを作成できます。

一部のセクションで変更するデータが多すぎる場合は、DB SnapShotをセットアップできます。そして、そのDeveloper Editionを入手すれば、節約できる時間は、その価格に見合うだけのものではありません。 ;-)

1
Fabricio Araujo