数据库的持续集成实践

在软件开发过程中,持续集成(Continuous Integration, CI)是一种常见的实践,它能够自动地对代码进行构建和测试。通常情况下,每次代码提交都会触发构建过程,并且运行一系列单元测试和集成测试。这样,开发者可以快速地获取到代码变更的验证,并且及时地发现问题。

早在2000年,Martin Fowler就撰写了关于持续集成的权威文章,因此这不是一个新概念。实际上,对于许多开发团队来说,这是处理应用程序代码的标准做法。然而,对于数据库层来说,实现持续集成要困难一些。

为什么数据库的持续集成会是一个问题呢?数据库代码与应用程序代码不同,它不像一组可以复制和移动的文件,而且不需要编译。这意味着第一个问题是没有东西可以放入源代码控制系统。除了变更跟踪和共享变更的好处之外,源代码控制系统提供了代码的“唯一真实版本”的单一位置,这是持续集成中部署的来源。

此外,SQL是声明式的,而DDL语句会修改数据库的当前状态。因此,每次进行更改时,都必须考虑引用完整性,并确保数据得以保留。在实践中,这意味着需要大量的迁移脚本。需要确定源数据库的状态,与目标数据库的差异,并编写脚本来正确地迁移。

为了解决这个问题,理想的解决方案应该允许将数据库放入源代码控制系统,并自动化变更脚本的创建。它应该包括数据库模式和应用程序所需的任何静态数据。数据库应该与应用程序代码一起进入源代码控制系统,并通过构建系统从那里部署。

本文的其余部分概述了如何使用SQL Developer Bundle,特别是SQL Source Control来实现这些过程。首先,需要将数据库放入源代码控制系统。SQL Source Control本身并不是源代码控制系统,它是SQL Server Management Studio的一个插件,可以将其与现有的源代码控制系统连接起来。

当前版本支持Subversion和Team Foundation Server。即将发布的SQL Source Control 2.1将支持任何具有命令行接口的源代码控制系统,最初将内置SourceGear Vault和Mercurial支持。

要设置,需要将数据库链接到源代码控制系统: 输入源代码存储库的详细信息,链接数据库,然后提交对象。 从版本2开始,还可以选择将静态数据放入源代码控制。为此,请在对象资源管理器中右键单击数据库,然后单击“链接/取消链接静态数据…”。一个对话框将显示,让选择要源代码控制的表。

当部署时间到来时,需要再次从源代码控制系统中获取数据库。为此,SQL Compare和SQL Data Compare具有命令行接口,可以在构建服务器上使用它们,例如与MS Build、NAnt或TeamCity一起使用。

以下是一个从Team Foundation Server部署AdventureWorks数据库的命令行脚本示例: cd "C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE" tf get "C:\Scripts\AdventureWorks" /version:T cd "C:\Program Files\Red Gate\SQL Compare 8" sqlcompare /scr1:"C:\Scripts\AdventureWorks" /s2:TestingServer\SQL2008 /UserName2:TestUser /db2:AdvWrksTst /Report:"C:\SchemaDiffReport.html" /ReportType:Interactive /ScriptFile:"C:\SchemaSyncScript.sql" /sync cd "C:\Program Files\Red Gate\SQL Data Compare 8" sqldatacompare /scr1:"C:\Scripts\AdventureWorks" /s2:TestingServer\SQL2008 /UserName2:TestUser /db2:AdvWrksTst /o:Default /ScriptFile:"C:\DataSyncScript.sql" /sync 命令行已在在线文档中完全记录 - SQL Compare ,以及SQL Data Compare 。简而言之,脚本执行以下操作: tf get "C:\Scripts\AdventureWorks" /version:T 是TFS命令,它使用源代码控制系统中数据库的最新版本更新本地副本。 C:\Scripts\AdventureWorks 是本地文件夹的文件路径。 sqlcompare /scr1:"C:\Scripts\AdventureWorks" 指定本地文件夹作为模式比较的源。 /s2:TestingServer\SQL2008 指定模式同步(部署)的目标服务器。 /UserName2:TestUser 是目标服务器的用户名。 /db2:AdvWrksTst 指定TestingServer\SQL2008上的目标数据库。 /Report:"C:\SchemaDiffReport.html" 生成模式差异的报告并将其写入指定的文件。 /ReportType:Interactive 指定报告的格式,在这种情况下是详细的交互式HTML格式。 /ScriptFile 保存用于迁移更改的SQL脚本的副本。 /sync 同步数据源,使AdvWrksTst与AdventureWorks相同。 sqldatacompare /scr1:"C:\Scripts\AdventureWorks" 指定本地文件夹作为数据比较的源。 /ScriptFile:"C:\SchemaSyncScript.sql" 保存用于迁移模式更改的SQL脚本的副本。 /ScriptFile:"C:\DataSyncScript.sql" 保存用于迁移数据更改的SQL脚本的副本。

本质上,脚本从源代码控制系统获取数据库的最新版本,并将其部署到测试服务器上,创建迁移的详细报告。

结论:持续集成使开发项目更加高效 - 允许更早地捕获错误,并提供快速验证。长期以来,数据库不仅被排除在持续集成之外,而且根本没有源代码控制。

这里描述的工具提供了源代码控制和部署自动化,使可以将数据库代码与应用程序开发过程保持一致。

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485