比较SQL Server数据库的架构和数据(同时)并生成脚本。

3
我有一个相当大且复杂的数据库需要从版本1升级到版本2。在这两个版本之间,模式和数据发生了很多变化。
我知道这应该像这样进行版本控制:
http://www.codinghorror.com/blog/2008/02/get-your-database-under-version-control.html, 但事实并非如此——等我完成后就会这样做。
目前的问题是,我面临两种选择:要么查看所有提交记录,要么尝试在两个版本的数据库之间进行差异比较。到目前为止,我已经尝试过:
http://opendbiff.codeplex.com/
http://www.sqldelta.com/
http://www.red-gate.com/
然而,它们似乎都无法成功生成模式升级脚本,因为它们不会同时处理数据。这会导致在向表添加新键时出现外键违规,因为它引用的表是新的,虽然该表的模式已经创建,但其中包含的数据并没有。它可以,但这需要我使用工具的不同部分,然后将两个脚本混合在一起。
我知道这可能看起来像是重复的:
What is best tool to compare two SQL Server databases (schema and data)? 这是我找到大多数现有工具的地方,但到目前为止,我还没有成功地获得任何一个可以生成可用的模式迁移脚本的工具(我真的不太关心数据,但我确实需要外键所需的数据——这就是我部署旧版本和新版本之间所有的区别)。
我期望过高吗?
我应该放弃并开始手动拼接我已经有的内容吗?
还是我要查看所有提交记录并手动创建升级脚本?

2
你可以尝试我的工具 - 你可以在http://www.atlantis-interactive.co.uk找到它们。它们可能不会比其他工具更好,但它们可能会有所帮助。当然,你可以创建一个模式同步,不包括外键,然后同步数据,再包括这些键。 - Matt Whitfield
@MattWhitfield,哇,我以前从未见过你的产品。但是在2008/2009年当我做研究时,周围没有好的且价格实惠的产品。为分享你的工作点赞! - Lucero
谢谢Matt,我认为你和Lucero的解决方案,即同步模式减去FK,然后数据,然后FK,将是必须的。我只是有点惊讶,没有其他人遇到这个问题。难道没有人使用FK吗?还是人们在开发过程中只编写适当的升级脚本? - jmc
@JamieMcNaught - 实际上,给我发电子邮件询问这个问题的人数相当高。通常情况下,这是因为他们没有使用外键,在开发环境中编写了代码,将其同步到生产环境后才意识到他们的生产数据库存在不一致的数据 - 因此数据同步部分通常不涉及其中。 - Matt Whitfield
@JamieMcNaught 每个人都应该遇到这些问题... 在使用我的工具集时,外键在初始数据设置和运行表迁移脚本期间会自动处理(暂时禁用)。 - Lucero
2个回答

3

谢谢,Lucero。我会再等一段时间。我还在希望有人会说:“你在应用中勾选了这个框吗?”! - jmc
最终解决方案是使用 SQL Delta 分别生成模式和数据(唯一选项),然后运行所有模式脚本,但不包括 FK,运行数据脚本,最后再运行 FK。值得一提的是,SQL Delta 将所有 FK 保留在它生成的模式脚本中,直到最后,因此我只需要将模式脚本分成两个部分,而不必在整个过程中到处寻找 FK。 - jmc
@JamieMcNaught,感谢您的反馈。很高兴您找到了解决方案。现在所有的东西都在源代码控制下了吗? ;) - Lucero
我们正在逐步实现。Schema一直都有版本控制,但升级起来并不容易。现在我们在schema中加入了版本号、升级脚本,并最近添加了一个SMO脚本和MD5哈希函数,以确保在升级之前schema的版本号是正确的。 - jmc
@JamieMcNaught,哈,这听起来与我的版本控制系统非常相似 - 你有没有看过它?我也创建模式对象的哈希值(虽然是SHA1),并将其存储在数据库中,以快速找出DB是否与程序模式“相同”。由于SMO已被证明不实用(不同版本的SMO脚本略有不同,并且使用未管理的解析器组件作为依赖项很麻烦),因此我使用自己的脚本。 - Lucero

0

没有所谓的同时进行模式和数据处理。即使您将它们放在一个大脚本中,您仍然需要先处理模式,然后再处理数据。如果模式脚本创建了一个新表并向其中添加约束,则没有理由出现引用完整性违规错误,因为这些表中没有行。

无论如何,您应该尝试使用我们的xSQL Schema CompareData Compare工具,您会对其性能和控制水平印象深刻。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接