【问题标题】:Cannot copy a database schema to another SQL Server instance无法将数据库架构复制到另一个 SQL Server 实例
【发布时间】:2020-09-28 07:39:00
【问题描述】:

我有一个大型数据库,必须在较旧的 SQL Server 实例上重新创建。数据库保留了与旧服务器对应的兼容性级别设置。我知道,它不能保证完全的向后兼容性,但数据库架构最初是在考虑旧服务器版本的情况下创建和维护的。

这是我尝试过的:

  • 备份->恢复;当然它不起作用,因为在较新的服务器版本上创建数据库备份时无法降级(哦微软,为什么 Compat 级别也不会生成兼容的备份?)
  • DACPAC -> 未知原因失败,声称它缺少一些依赖对象(但它们存在于数据库中)
  • 生成架构脚本 - 在较新的 SQL Management Studio(尝试 v17 和 v18)上失败 Microsoft.SqlServer.Management.Smo.SmoException: Cyclic dependencies found.。在较旧的 SQL Management Studio (2008) 上,它不会失败,但会生成一个包含错误顺序对象的脚本,因此在视图中引用的表之前创建视图,当然,执行这样的脚本会失败
  • Visual Studio Schema 比较工具 - 失败并显示无意义的警告,并使更新按钮处于禁用状态Cannot generate deployment plan due to an internal error: An error occurred during deployment plan generation. Deployment cannot continue.

这个问题是否有可行的(最好是免费的)解决方案?如何在另一台服务器上的空数据库上复制数据库架构?

源 SQL 服务器版本:2017

目标 SQL 服务器版本:2008 R2

数据库兼容级别:2008 (100)

【问题讨论】:

  • 理论上是的。你有足够的代表知道如何提问。涉及的 SQL Server 版本有哪些?选择的兼容性设置是什么? (我可以看到您正在使用 SSMS 17 和 18 - 有助于了解)。
  • RE “在较旧的 SQL Management Studio 上,它会生成一个包含错误顺序对象的脚本,因此在视图中引用的表之前创建视图” - 假设使用 IF NOT EXISTS 构造并且语句由GO,然后您可以简单地运行脚本几次,直到创建所有依赖对象。 (以前自己做过)
  • @Alex 添加了版本号。但是,在查找错误时,我发现这些错误消息已经困扰 SQL Management Studio 多年,与 SQL Server 和数据库版本无关。不过,感谢有关“如果不存在”的提示-我将尝试在启用此设置的情况下运行。关于代表 - 所以似乎给予了太多的信任,我不应该得到那个:D
  • SSMS 有一个设置(高级->“服务器版本脚本”)来生成与早期版本兼容的脚本。这也可能会有所帮助。
  • 是的,请随时将其添加为答案,我会将其标记为最佳答案。看来,目前没有其他更好的解决方案来解决这个问题。

标签: sql-server compare database-schema migrate


【解决方案1】:

利用 IF NOT EXISTS 构造和批处理分隔符 (GO) 允许您多次运行脚本。

在第一次尝试时,可能不会创建一些对象,但这些错误不会阻止脚本的其余部分执行。

多次运行脚本,直到不再返回错误,将创建所有对象。

免责声明:来自个人经验。

【讨论】:

    猜你喜欢
    • 2018-06-08
    • 2014-09-17
    • 1970-01-01
    • 2020-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-16
    相关资源
    最近更新 更多