在软件开发过程中,持续集成(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脚本的副本。
本质上,脚本从源代码控制系统获取数据库的最新版本,并将其部署到测试服务器上,创建迁移的详细报告。
结论:持续集成使开发项目更加高效 - 允许更早地捕获错误,并提供快速验证。长期以来,数据库不仅被排除在持续集成之外,而且根本没有源代码控制。
这里描述的工具提供了源代码控制和部署自动化,使可以将数据库代码与应用程序开发过程保持一致。