我正在使用 VS2010 数据库项目作为在发布版本之间对我们的数据库代码进行版本控制的一种方式。到目前为止,提供的解决方案似乎不错;但是有一个问题我想知道是否有其他人遇到过。
从模式比较视图生成的升级脚本不可重新运行。作为一个标准,我通常会确保我的所有数据库发布脚本都是可重新运行的,以防万一将发布脚本部署到服务器时出现任何问题。
有谁知道是否有一种方法可以配置 VS2010 以创建可重新运行的升级脚本,即仅当存储过程存在时才删除它们等?
我正在使用 VS2010 数据库项目作为在发布版本之间对我们的数据库代码进行版本控制的一种方式。到目前为止,提供的解决方案似乎不错;但是有一个问题我想知道是否有其他人遇到过。
从模式比较视图生成的升级脚本不可重新运行。作为一个标准,我通常会确保我的所有数据库发布脚本都是可重新运行的,以防万一将发布脚本部署到服务器时出现任何问题。
有谁知道是否有一种方法可以配置 VS2010 以创建可重新运行的升级脚本,即仅当存储过程存在时才删除它们等?
vsdbcmd 的缺点是您必须跳过头才能将不可为空的列添加到表中。特别是如果你有很多数据。
可能会从 RedGate签出Sql Packager
完成模式比较并将数据库项目模型与数据库同步后,您可以构建它以获取数据库的 .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。
在 Visual Studio 2015(可能还有更早的版本)中,您可以将发布脚本设置为包含带有错误处理的单个事务。见下文:
将普通脚本包装在较大的事务中对我不起作用,因为该脚本在 Visual Studio 项目中可用的部署前/部署后脚本之外引入了 sqlcmd 错误处理:
:on error exit
这会阻止您使用 try-catch 有效地处理错误,并让您不得不手动回滚事务
注意:部署前/部署后脚本在“包含事务脚本”设置生成的事务之外运行,因此您必须自己管理这些