MSBuild:自动收集db迁移脚本?

时间:2010-05-20 09:44:29

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

环境概要。

  • Asp.net网络应用程序(存储在svn中的源代码)
  • SQL Server数据库。 (存储在svn中的数据库模式(表/ sprocs))
  • db版本与Web应用程序程序集版本同步。 (存储在表'CurrentVersion')
  • CI hudson服务器从repo检出Web应用程序并运行自定义msbuild文件发布/打包应用程序。

我的msbuild脚本在每个版本上更新Web应用程序(Major.Minor.Revision.Build)的程序集版本。 'Revision'设置为当前检出的svn版本和'build'到hudson内部版本号(在每个自动构建时递增)。

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

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

这可以通过手动调用svn diff -r REVNO:REVNO命令列出已更改的.sql文件来轻松实现。然后可以手动将这些文件添加到包中。 如果这可以自动化将会很棒。

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

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

4 个答案:

答案 0 :(得分:4)

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

1)您需要将增量打包到可部署包中。请注意,您应该打包 deltas - 而不是以当前状态创建架构的静态文件。这些delta脚本应该在源代码管理中。将静态模式保留在源代码控制中也没关系,但您必须使其与增量保持同步。实际上,您可以使用Red Gate的SQLCompare或VS数据库版本等工具从静态模式生成(大多数)增量。要将增量扩展到可部署的包中,并且假设您正在使用svn - 您可能需要查看svn:externals,以便将delta脚本“软链接”到您的Web项目中。然后,您的构建脚本可以将它们复制到可部署的包中。

2)您需要一个能够读取增量文件列表的系统,将它们与现有数据库进行比较,确定需要将哪些增量应用于该数据库,然后应用增量(并更新簿记信息,如数据库版)。有一个名为dbdeploy的开源项目(由ThoughtWorks赞助)完成了这项工作。我亲自用这个工具取得了一些成功。

祝你好运 - 这是一个难以破解的(正确的)。

答案 1 :(得分:2)

查看SQL数据库项目。在VS 2010中,它们得到了相当大的增强,并具有内置的部署功能,可以将DEV数据库同步到其他环境。

以下是有关vs 2010中数据库项目的一些很好的链接: http://msmvps.com/blogs/deborahk/archive/2010/05/02/vs-2010-database-project-building-and-deployment.aspx

http://weblogs.asp.net/gunnarpeipman/archive/2009/07/29/visual-studio-2010-database-projects.aspx

答案 2 :(得分:0)

尝试SQL Examiner: http://www.sqlaccessories.com/Howto/Version_Control.aspx

您可以使用SQL Examiner命令行工具自动执行脚本收集。

答案 3 :(得分:0)

目前可用于解决.NET / SQL Server堆栈的解决方案是:

  • DBUp(开源)
  • ReadyRoll(更深入的Visual Studio集成, 自动生成脚本)

后一种产品是我们在Redgate积极开发的产品。