【问题标题】:Can a VS2010 Database Project create re-runnable deployment scripts?VS2010 数据库项目可以创建可重新运行的部署脚本吗?
【发布时间】:2011-05-16 16:32:48
【问题描述】:

我使用 VS2010 数据库项目作为在发布版本之间对我们的数据库代码进行版本控制的一种方式。到目前为止,提供的解决方案似乎不错;但是有一个问题我想知道是否有其他人遇到过。

从架构比较视图生成的升级脚本不可重新运行。作为一个标准,我通常会确保我的所有数据库发布脚本都是可重新运行的,以防万一将发布脚本部署到服务器时出现任何问题。

有谁知道是否有一种方法可以配置 VS2010 以创建可重新运行的升级脚本,即仅当存储过程存在时才删除它们等?

【问题讨论】:

  • 我还没有找到解决这个问题的办法。我在 VS 生成脚本后手动编辑脚本。

标签: sql-server visual-studio-2010 database-project


【解决方案1】:

可能会从 RedGate 签出 Sql Packager

【讨论】:

  • 这不会产生可重新运行的脚本。它需要一个脚本并创建一个 exe。但是,如果在事务中运行,脚本会在失败时回滚。
【解决方案2】:

完成架构比较并将数据库项目模型与数据库同步后,您可以构建它以获取数据库的 .dbschema 文件。

这可以与 vsdbcmd 一起使用来创建更改脚本以升级早期版本的数据库以匹配 .dbschema 文件中定义的版本。这将为您提供可重新运行的升级脚本,如果失败,它会告诉您失败的原因,并且不会对目标数据库进行任何更改。但是,只有在从同一个数据库版本转换到同一个数据库版本时,它才能被重用。

我们迁移到数据库项目(从 redgate sql 比较生成的脚本)的主要原因之一是为了摆脱这个问题。我们所有的升级脚本都是从特定版本到特定版本。 DB 项目的主要好处之一是您不需要拥有可重新运行的脚本。您拥有定义目标应如何结束的 .dbschema 文件,并让 VSDBCMD 完成所有工作。我们甚至不倾向于生成脚本,我们使用 VSDBCMD 直接更新数据库。

如果你沿着这条路线走,http://blogs.msdn.com/b/bahill/archive/2009/02/21/deploying-your-database-project-without-vstsdb-installed.aspx 有一个在你的开发环境之外运行 VSDBCMD 所需的先决条件列表。

【讨论】:

    【解决方案3】:

    vsdbcmd 的缺点是您必须跳过头才能将不可为空的列添加到表中。特别是如果你有很多数据。

    【讨论】:

      【解决方案4】:

      在 Visual Studio 2015(可能还有更早的版本)中,您可以将发布脚本设置为包含带有错误处理的单个事务。见下文:

      SSDT publishing with "Include Transactional Scripts"

      将普通脚本包装在更大的事务中对我来说不起作用,因为该脚本在 Visual Studio 项目中可用的部署前/部署后脚本之外引入了 sqlcmd 错误处理:

      :on error exit
      

      这会阻止您使用 try-catch 有效地处理错误,并让您不得不手动回滚事务

      注意:部署前/部署后脚本“包含事务脚本”设置生成的事务之外运行,因此您必须自己管理这些

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-11-07
        • 1970-01-01
        相关资源
        最近更新 更多