統合テスト用のテストデータベース(SQL Server内)の操作方法を定義しようとしています。
私の考えは、統合テストアセンブリの起動時に次の手順を実行することでした。
(db)_Basis
というデータベーススナップショットを、将来の統合テストの「ベースライン」として取得しますすべてのテストクラス(1-nテストを含む)の前に、「スナップショットからの復元」を実行して、データベースの明確で多かれ少なかれ「空」の状態に戻すことを計画していました。これまでのところ魅力のように動作します。
ただし、大規模なテストデータベースで動作する必要がある統合テストのセットがあります。したがって、これらの各テストフィクスチャ(n個の個別のテストを持つクラス)の前にこれを実行することを望んでいました
(db)_Basis
スナップショットからデータベースを復元する(db)_With_Testdata
スナップショット次に、各テストについて、データベースを明確に定義された(db)_With_Testdata
スナップショットバージョンにリセットし、テストを実行し、結果を確認します。
問題は:two dbスナップショットを同時に持つことができないようです-一度実行すると、データベースをどちらにも復元できません...このエラーが発生し続けます:
メッセージ3137、レベル16、状態4、行9
データベースを元に戻すことはできません。プライマリ名またはスナップショット名のいずれかが正しく指定されていないか、他のすべてのスナップショットが削除されていないか、またはファイルがありません。メッセージ3013、レベル16、状態1、行9
RESTORE DATABASEが異常終了しています。
それは本当にSQL Serverデータベースのスナップショットのしくみですか?ひどく制限しているようです.....元の "(db)_Basis"スナップショットに直接戻ることができなかった場合に理解できると思います-しかし、2つのスナップショットがあるため、最新のスナップショットに戻ることすらできません。 ?!?!?
残念ながら、それは仕様によるものです。
BOLページから取得 " データベースをデータベーススナップショットに戻す ":
制限と制限
次の状況では、復帰はサポートされていません。
- 現在、データベースにはデータベーススナップショットが1つだけ必要です。
- 読み取り専用または圧縮されたファイルグループはデータベースに存在します。
- ファイルは現在オフラインですが、スナップショットの作成時にオンラインでした
別の方法として、最初のスナップショットを削除することもできます(db)_Basis
。これは非常に制限されているように見えますが、このように見ると理解できます。スナップショットは元のデータファイルに基づくスパースファイルであるため、特定のスナップショットに戻すと、すべてのスナップショットが無効になります(元のデータファイルは、元に戻す操作によって変更されます)。 。制限は厄介なものになる可能性がありますが、不合理に見えません。
別の視点は、バックアップを取り、それらを復元することです-いくつかのルックアップ値で空のデータベースとスキーマを作成しているだけだからです。
また、50K行を挿入するだけで、データベースはそれほど大きくなりません。圧縮を使用すると、バックアップサイズも小さくなります。
TSQLエージェントジョブまたはスクリプトのみを使用できます(ストアドプロシージャを作成して、得られた出力に基づいてテストの後に呼び出すことができます)。
(db)_Basis
(db)_With_Testdata
統合スクリプトを実行し、最終出力に基づいて、上記のジョブのいずれかを実行して、目的のポイントに戻すことができます。
データベーススナップショットの制限 に達しているため、このシナリオではバックアップ/復元方法は非常に洗練されていると思います。また、Paul Randalは、 SQL Server 2012までのすべてのバージョンの厄介なバグについてブログに投稿しました (それが後のCUで修正されているかどうかは不明です)
データベーススナップショットに戻すと、ソースデータベースのトランザクションログファイルが取り除かれ、2つの0.25MB VLFを持つ0.5MBログファイルに置き換えられます。