1

我要求客户向我发送他们当前的 MS SQL 数据库的副本。我没有获得数据库备份或可用于重新创建数据库的一小组脚本,而是为我提供了数百个单独的 SQL 脚本,并且没有关于它们需要运行的顺序的说明。

这些脚本不能简单地在一个批处理操作中执行,因为表之间存在外键依赖关系。似乎他们将这些脚本限制为为每个脚本创建一个表或存储过程。

通常,我只是要求客户以更有用的格式提供信息,但他们不知道及时回复我们,而且由于他们的延迟,我们的项目时间表已经处于危险之中。

有没有什么工具可以用来从这组庞大的脚本中重新创建数据库?

4

5 回答 5

5

这可能听起来有点神秘,但您可以迭代地执行以下操作:

  1. 将所有脚本放入“要运行的脚本”列表中
  2. 运行“待运行”脚本中的所有脚本
  3. 删除成功的运行
  4. 重复 2-3 直到没有脚本

没有依赖关系的脚本将在第一轮完成。在下一轮中依赖它们的那些,然后以此类推。

我建议您从一个元脚本操作所有这些,它使用数据库表来存储可用脚本的名称。

祝你好运。

于 2012-12-07T19:39:04.893 回答
1

如果您在 Red Gate SQL Compare 中将您的脚本文件夹设置为数据源,并指定一个空白数据库作为目标,它应该允许您比较并部署到目标数据库。这是因为该工具能够从您指定的文件夹中递归地读取所有 SQL 创建脚本。这是一个功能齐全的 14 天试用版,因此您可以轻松地在您的场景中对其进行测试。

http://www.red-gate.com/products/sql-development/sql-compare/

于 2012-12-08T01:42:43.877 回答
0

以戈登为基础。
将它们分成一张桌子。
计算 FK 的数量并从最少的第一个开始排序。
然后删除按照 Gordon 建议运行的脚本。
另一个潜在的问题是创建表并在 FK 上失败并离开表。
您稍后再回来创建镜头,并且桌子已经在那里,所以它失败了。

如果您使用表 FK 解析它们 从
列表中没有 FK 的表开始
然后循环通过带有 FK 的表
仅当所有 FK 都已在列表中时才添加到列表中。

如果您了解 .NET,那么一个具有字符串属性表、字符串属性脚本和 FK 属性名称的属性列表字符串的类。
他们应该解析出非常干净的正则表达式。

于 2012-12-07T19:43:31.407 回答
0

(也许)最快(也是迄今为止最肮脏)的方法是将所有脚本连接在一起,确保在每个脚本之间都有一个 GO 语句。确保您的脚本中没有 DROP 语句,否则此技术将不起作用。

重复运行连接脚本......我不知道,大约 10 次迭代。您可能会在测试系统中正确地重新创建他们的数据库。

如果您感觉更严格,请遵循 Gordon 的建议。我真的不知道有什么工具能够重建依赖关系,但你可能想看看 Red-Gate 的 SQL 比较,你可以免费获得一个演示,并且可以做一些非常神奇的事情.

于 2012-12-07T19:44:57.277 回答
0

您可以删除所有外键约束。然后,组织脚本,使其首先创建所有表,然后添加回所有外键。最后创建索引。

于 2012-12-07T19:45:06.793 回答