用于集成测试的 SQL Server 数据库快照

mar*_*c_s 14 sql-server snapshot

我正在尝试定义一种使用测试数据库(在 SQL Server 中)进行集成测试的方法。

我的想法是在启动集成测试程序集时执行以下步骤:

  • 创建一个完全空的数据库
  • 运行“创建数据库对象”脚本以创建所有相关的数据库对象(表、视图、序列等)
  • 填充“基础数据”(查找值等)
  • 拍摄一个称为(db)_Basis“基线”的数据库快照,用于未来的集成测试

现在,在每个测试类(包含 1-n 个测试)之前,我计划简单地执行“从快照恢复”以恢复到定义明确的、或多或少的数据库“空”状态。到目前为止,它就像一个魅力。

但是,有一组集成测试需要在大型测试数据库上运行 - 所以我希望在每个测试装置(具有 n 个单独测试的类)之前执行此操作

  • (db)_Basis快照恢复数据库
  • 将那 50'000 多行数据插入到数据库中
  • 创建另一个快照(db)_With_Testdata快照

然后对于每个测试,将数据库重置为明确定义的(db)_With_Testdata快照版本,运行测试,验证结果等等。

问题是:我似乎无法同时拥有两个数据库快照 - 一旦我这样做了,我就无法将我的数据库恢复到其中任何一个......我不断收到此错误:

消息 3137,级别 16,状态 4,第 9 行
数据库无法恢复。主要或快照名称指定不正确,所有其他快照尚未删除,或者缺少文件。

消息 3013,级别 16,状态 1,第 9 行
RESTORE DATABASE 异常终止。

这真的是 SQL Server 数据库快照的工作方式吗??似乎非常限制..... 如果我不能直接回到原始的“(db)_Basis”快照我会理解 - 但仅仅因为我现在有两个快照,我什至不能回到最近的一个?!?!?

spa*_*dba 12

不幸的是,这是设计使然。

取自 BOL 页面“将数据库还原为数据库快照”:

限制和限制

在以下情况下不支持恢复:

  • 数据库当前必须只有一个您计划恢复的数据库快照
  • 数据库中存在任何只读或压缩文件组。
  • 任何文件现在都处于脱机状态,但在创建快照时处于联机状态

作为替代方案,您可以删除第一个快照(db)_Basis。我可以理解这似乎非常有限,但可以这样看:快照是基于原始数据文件的稀疏文件,因此恢复到特定快照将使所有快照无效(恢复操作将更改基本数据文件) . 限制可能很烦人,但看起来并非不合理。