web-dev-qa-db-ja.com

統合テスト用のSQL Serverデータベーススナップショット

統合テスト用のテストデータベース(SQL Server内)の操作方法を定義しようとしています。

私の考えは、統合テストアセンブリの起動時に次の手順を実行することでした。

  • 完全に空のデータベースを作成する
  • 「データベースオブジェクトの作成」スクリプトを実行して、関連するすべてのデータベースオブジェクト(テーブル、ビュー、シーケンスなど)を作成します。
  • 「ベースデータ」(ルックアップ値など)を入力します
  • (db)_Basisというデータベーススナップショットを、将来の統合テストの「ベースライン」として取得します

すべてのテストクラス(1-nテストを含む)の前に、「スナップショットからの復元」を実行して、データベースの明確で多かれ少なかれ「空」の状態に戻すことを計画していました。これまでのところ魅力のように動作します。

ただし、大規模なテストデータベースで動作する必要がある統合テストのセットがあります。したがって、これらの各テストフィクスチャ(n個の個別のテストを持つクラス)の前にこれを実行することを望んでいました

  • (db)_Basisスナップショットからデータベースを復元する
  • これらの50'000以上のデータ行をデータベースに挿入する
  • 別のスナップショットを作成(db)_With_Testdataスナップショット

次に、各テストについて、データベースを明確に定義された(db)_With_Testdataスナップショットバージョンにリセットし、テストを実行し、結果を確認します。

問題は:two dbスナップショットを同時に持つことができないようです-一度実行すると、データベースをどちらにも復元できません...このエラーが発生し続けます:

メッセージ3137、レベル16、状態4、行9
データベースを元に戻すことはできません。プライマリ名またはスナップショット名のいずれかが正しく指定されていないか、他のすべてのスナップショットが削除されていないか、またはファイルがありません。

メッセージ3013、レベル16、状態1、行9
RESTORE DATABASEが異常終了しています。

それは本当にSQL Serverデータベースのスナップショットのしくみですか?ひどく制限しているようです.....元の "(db)_Basis"スナップショットに直接戻ることができなかった場合に理解できると思います-しかし、2つのスナップショットがあるため、最新のスナップショットに戻ることすらできません。 ?!?!?

14
marc_s

残念ながら、それは仕様によるものです。

BOLページから取得 " データベースをデータベーススナップショットに戻す ":

制限と制限

次の状況では、復帰はサポートされていません。

  • 現在、データベースにはデータベーススナップショットが1つだけ必要です。
  • 読み取り専用または圧縮されたファイルグループはデータベースに存在します。
  • ファイルは現在オフラインですが、スナップショットの作成時にオンラインでした

別の方法として、最初のスナップショットを削除することもできます(db)_Basis。これは非常に制限されているように見えますが、このように見ると理解できます。スナップショットは元のデータファイルに基づくスパースファイルであるため、特定のスナップショットに戻すと、すべてのスナップショットが無効になります(元のデータファイルは、元に戻す操作によって変更されます)。 。制限は厄介なものになる可能性がありますが、不合理に見えません。

12
spaghettidba

別の視点は、バックアップを取り、それらを復元することです-いくつかのルックアップ値で空のデータベースとスキーマを作成しているだけだからです。

また、50K行を挿入するだけで、データベースはそれほど大きくなりません。圧縮を使用すると、バックアップサイズも小さくなります。

TSQLエージェントジョブまたはスクリプトのみを使用できます(ストアドプロシージャを作成して、得られた出力に基づいてテストの後に呼び出すことができます)。

  • 基本バックアップ-(db)_Basis
  • Testdataバックアップあり-(db)_With_Testdata

統合スクリプトを実行し、最終出力に基づいて、上記のジョブのいずれかを実行して、目的のポイントに戻すことができます。

データベーススナップショットの制限 に達しているため、このシナリオではバックアップ/復元方法は非常に洗練されていると思います。また、Paul Randalは、 SQL Server 2012までのすべてのバージョンの厄介なバグについてブログに投稿しました (それが後のCUで修正されているかどうかは不明です)

データベーススナップショットに戻すと、ソースデータベースのトランザクションログファイルが取り除かれ、2つの0.25MB VLFを持つ0.5MBログファイルに置き換えられます。

4
Kin Shah