我请求客户端向我发送他们当前MS SQL数据库的副本。我没有给出数据库备份或可用于重新创建数据库的一小组脚本,而是提供了数百个单独的SQL脚本,并且没有关于它们需要运行的顺序的说明。 / p>
脚本不能简单地在一个批处理操作中执行,因为表之间存在外键依赖关系。似乎他们将这些脚本限制为按脚本创建单个表或存储过程。
通常情况下,我只是要求客户以更有用的格式提供信息,但他们并不知道及时回复我们,而且我们的项目时间表已经因为延迟而处于危险之中他们的结局。
我可以使用任何工具从这组庞大的脚本中重新创建数据库吗?
答案 0 :(得分: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)
您可以删除所有外键约束。然后,组织脚本以便它首先创建所有表,然后添加所有外键。最后创建索引。