【问题标题】:Compare SQL Server DB schema & data (at the same time) and generate scripts比较 SQL Server 数据库架构和数据(同时)并生成脚本
【发布时间】:2013-12-07 00:00:42
【问题描述】:

我有一个相当大/复杂的数据库,我需要在现场从版本 1 升级到版本 2。架构和重要的两者之间的数据有很多变化。

是的,我知道这应该是版本控制的 alla:
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)? 这是我找到我尝试过的大多数现有工具的地方,但到目前为止,我还没有设法让其中任何一个生成一个工作模式迁移脚本(我真的对数据不太在意,但我确实需要外键所需的数据 - 这就是我部署旧版本和新版本时的全部区别。

我是不是期望太高了? 我应该放弃并开始手动拼接我拥有的东西吗? 还是我要完成所有提交并手动创建升级脚本?

【问题讨论】:

  • 你可以试试我的工具——你可以在atlantis-interactive.co.uk找到它们。他们可能不会更好地工作,但他们可能能够。当然,您可以创建不包含外键的模式同步,然后同步数据,然后包含键。
  • @MattWhitfield,哇,我以前从未见过你们的产品。但早在 2008/2009 年,当我进行研究时,周围并没有任何优质且价格合理的产品。为分享您的工作点赞!
  • 谢谢马特,我认为你和卢塞罗的解决方案是同步模式减去 FK,然后是数据,然后是 FK。我只是有点惊讶,没有其他人有这个问题。没人用FK吗?还是人们只是在开发过程中编写适当的升级脚本?
  • @JamieMcNaught - 实际上,向我发送电子邮件询问的人数相当多。通常虽然是因为他们没有使用 FK,但在 DEV 中编写它们,将它们同步到生产环境,然后意识到他们的生产数据库有不一致的数据 - 所以数据同步位通常不会进入它。
  • @JamieMcNaught 每个人都应该有这些问题...使用我的工具集时,在初始数据设置和运行表迁移脚本时会自动处理(暂时禁用)FK。

标签: sql-server sql-server-2008-r2 compare


【解决方案1】:

我想不出比您尝试过的工具更强大的可用工具了。如果这些都失败了,我的homegrown versioning system 可能也帮不了你太多。

但是,您应该能够生成更新脚本,然后手动编辑它以向其中添加数据转换。

并且/或者您可以在更新脚本运行期间disable the foreign key constraints

【讨论】:

  • 谢谢卢塞罗。我会坚持一段时间。我仍然希望有人会说“你没有在应用程序中勾选这个框吗?”!!
  • 最终解决方案是使用 SQL Delta 分别生成模式和数据(唯一的选择),然后运行除 FK 之外的所有模式脚本,运行数据脚本,最后运行 FK。有用的是,SQL Delta 将所有 FK 保留在它生成的模式脚本中,直到最后,所以我只需要将模式脚本分成两部分,而不必遍历整个过程,发现 FK 到处都是。
  • @JamieMcNaught,感谢您的反馈。很高兴您找到了解决方案。现在一切都在源代码控制之下吗? ;)
  • 我们快到了。 Schema 一直是版本控制的,但不是以一种易于升级的方式。现在在架构、升级脚本中有版本号,最近添加了一个 SMO 脚本 + MD5 散列函数来检查架构实际上是它在升级之前声称的版本号。
  • @JamieMcNaught,哈,这听起来和我的版本控制系统非常相似——你看过吗?我还创建了模式对象的散列(虽然是 SHA1),并将其存储在数据库中以快速找出数据库是否与程序模式“相同”。而且我使用自己的脚本,因为 SMO 已被证明是不切实际的(不同版本的 SMO 脚本略有不同,并且将 SMO 作为非托管解析器组件的依赖项很痛苦)。
【解决方案2】:

没有“同时”处理架构和数据这样的事情。即使你将它们放在一个大脚本中,你仍然会先做模式,然后再做数据。如果架构脚本创建了一个新表并向其添加了一个约束,那么您没有理由会收到参照完整性违规错误,因为这些表中没有行。

无论如何,您都应该尝试一下我们的xSQL Schema CompareData Compare 工具,您会对所获得的性能和控制水平印象深刻。

【讨论】:

    猜你喜欢
    • 2023-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-24
    • 1970-01-01
    • 2020-04-09
    • 2018-12-01
    • 1970-01-01
    相关资源
    最近更新 更多