如何从数百个单独的脚本重建数据库模式?

时间:2012-12-07 19:34:26

标签: sql sql-server-2008

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

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

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

我可以使用任何工具从这组庞大的脚本中重新创建数据库吗?

5 个答案:

答案 0 :(得分:5)

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

  1. 将所有脚本放入“要运行的脚本”列表中
  2. 运行“待运行”脚本中的所有脚本
  3. 删除成功的运行
  4. 重复2-3直到没有剩下脚本
  5. 没有依赖关系的脚本将在第一轮完成。在下一轮依赖它们的那些,然后依此类推等等。

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

    祝你好运。

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

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

如果你用表格FK解析它们 从列表中没有FK的表开始 然后用FK循环通过表格 如果所有FK都已在列表中,则仅添加到列表。

如果你知道.NET那么一个带有字符串属性表的类,sting属性脚本和一个FK属性名称的属性List String。
他们应该解析相当干净的正则表达式。

答案 3 :(得分:0)

(可能)这样做的最快(也是最脏的)方法是将所有脚本连接在一起,确保每个脚本之间都有一个GO语句。确保脚本中没有DROP语句,否则此技术将无效。

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

如果你感觉更严格,请按照戈登的建议行事。我真的不知道一个能够重建依赖关系的工具,但你可能想看看Red-Gate的SQL Compare,你可以免费获得一个演示版,并且可以做一些非常神奇的事情

答案 4 :(得分:0)

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