asp.net - MSBuild:自动收集数据库迁移脚本?

标签 asp.net sql-server svn msbuild continuous-integration

环境摘要。

  • Asp.net Web 应用程序(源存储在 svn 中)
  • SQL Server 数据库。 (存储在 svn 中的数据库架构(表/存储过程))
  • 数据库版本与 Web 应用程序程序集版本同步。 (存储在表“CurrentVersion”中)
  • CI Hudson 服务器,用于从存储库中检查 Web 应用程序并运行自定义 msbuild 文件来发布/打包应用程序。

我的 msbuild 脚本会在每次构建时更新 Web 应用程序的程序集版本 (Major.Minor.Revision.Build)。 “修订版”设置为当前 checkout 的 svn 修订版,“构建”设置为 hudson 构建号(在每次自动构建时递增)。

这样我就可以将应用程序与特定的主干版本相匹配,还可以从 hudson 版本号获取其他版本统计信息。

我想自动收集迁移脚本(更新的存储过程等)以添加到 zip 包中。 我想通过将尚未部署的数据库的 svn 版本与正在部署的版本进行比较,我可以找到自上次部署到该数据库/环境以来主干中发生了哪些数据库文件的更改。

这可以通过手动调用 svn diff -r REVNO:REVNO 轻松实现命令列出已更改的 .sql 文件。然后,必须手动将这些文件添加到包中。 如果这可以自动化,那就太好了。

首先,我想我必须编写一个自定义任务来检查尚未部署的数据库的版本。之后我就很不确定了。 有没有人对如何通过现有或自定义的 msbuild 任务来实现这一点有任何建议?

最后,我必须自动生成一个脚本以添加到更新数据库版本表的包中,以便与应用程序同步。

最佳答案

将 SQL 更改集成到自动构建/部署过程中非常困难。我知道,因为我已经尝试过几次但收效甚微。你想做的事情大致是在正确的轨道上,但我认为它实际上有点太复杂了。在您的提案中,您建议收集需要在构建/打包时应用于数据库的特定 SQL 脚本。相反,您应该将所有增量脚本(针对数据库的整个历史记录)打包到您的项目中,并计算部署时实际需要应用的增量 - - 这样,您的可部署包可以部署到具有不同版本数据库的环境中。要实现此目的,您需要两个实现部分:

1) 您需要将增量打包到可部署包中。请注意,您应该打包增量 - 而不是在当前状态下创建架构的静态文件。这些增量脚本应该在源代码管理中。也可以将静态模式保留在源代码管理中,但您必须使其与增量保持同步。实际上,您可以使用 Red Gate 的 SQLCompare 或 VS 数据库版本等工具从静态模式生成(大多数)增量。要将增量添加到可部署包中,并且考虑到您正在使用 svn,您可能需要研究 svn:externals 作为将增量脚本“软链接(soft link)”到您的 Web 项目中的方法。然后,您的构建脚本可以将它们简单地复制到您的可部署包中。

2) 您需要一个可以读取增量文件列表、将它们与现有数据库进行比较、确定需要将哪些增量应用到该数据库、然后应用增量的系统(并更新簿记信息,例如数据库版本)。有一个名为 dbdeploy 的开源项目(由 ThoughtWorks 赞助)就可以实现这一点。我个人已经使用该工具取得了一些成功。

祝你好运——这是一个很难(正确地)破解的难题。

关于asp.net - MSBuild:自动收集数据库迁移脚本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2872555/

相关文章:

ASP.NET global.asax 用法

asp.net - .NET 中的堆栈溢出将 IIS 发送到 100% CPU 使用率 - 为什么没有 StackOverflowException?

asp.net - asp.net中的用户控件错误

sql - 根据 ID 列将行转置为列

svn - 跨多台计算机管理单独项目的简单方法

java - 用于临时注释掉代码的 SVN 预提交 Hook (在 Java 中)?

iphone - 支持所有移动平台和 .net Web 应用程序的聊天功能框架

mysql - 我如何将 "migrate"结构从 aspnetdb.mdf 转换为 mysql 数据库

sql-server - 如何将Sql列转换为行?

svn - 我的构建应该提交吗?