本系列文章目錄
資料庫開發的持續整合 - Sql Server 部署升級工具
資料庫開發的持續整合 - Sql Server資料庫結構比較
資料庫開發的持續整合 - 方法和流程
資料庫開發的持續整合 - Liquibase的簡介和應用
資料庫的持續整合 - CruiseControl.Net的項目配置
上回說到了資料庫開發的持續整合的總的意圖,提供一個資料庫部署和升級的工具,接下來說說如何進行資料庫比較。
在我的開發中資料庫比較工具主要需要兩種形式: 案頭工具和MsBuid任務。
案頭工具推薦開源的DaBCoS3,基本夠用,有朋友推薦直接用VS2005,但我比較喜歡小巧一點的東東,因為不僅僅在資料庫開發的時候用。
MsBuild任務很重要,在持續整合的時候可用來驗證升級指令碼是否正常工作。在CC.Net中加入SqlDeply任務(MsBuild),對產品系統資料庫的副本進行升級,然後使用MsBuild資料庫比較任務比較升級後的結構與開發資料庫是否相同。以此來驗證升級指令碼,相當於對升級指令碼做自動化的測試(當然還有迴歸測試),可大大節約人力。
在網上搜尋一大圈,發現Red Gate提供的程式集不錯,但要$,放棄。繞了一大圈,回到M$,PowerTools被選中。要先裝Team Edition for Database。
資料結構比較的MsBuild任務如此例:
<Project DefaultTargets="SchemaCompare" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<UsingTask TaskName="SqlSchemaCompareTask" AssemblyName="Microsoft.VisualStudio.TeamSystem.Data.PowerTools.Tasks, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"/>
<PropertyGroup>
<UpdateSql/>
</PropertyGroup>
<Target Name ="SchemaCompare">
<SqlSchemaCompareTask
SourceConnectionString="server=product;user id=sa;password=mypass"
SourceDatabaseName="Northwind"
TargetConnectionString="Data Source=.;Integrated Security=True;Pooling=False"
TargetDatabaseName="Northwind"
OutputPath= "."
OutputFileName = "update.sql"
ForceColumnOrder="true"
IgnoreExtendedProperties="true"
IgnoreStatistics="true"
IgnoreConstraintNames="true"
IgnoreQuotedIdentifiersAndAnsiNullSettings="true"
IgnoreTriggerOrder="true"
IgnoreUsers="true"
IgnoreWhiteSpace="true"
DoNotOutputCommentHeader="true"
NoTransactionalChangeScript="true"
SkipSETStatements="true"
ScriptCollationWhenDifferentFromDefault="true"
/>
<ReadLinesFromFile File="update.sql">
<Output TaskParameter="Lines" PropertyName="UpdateSql" />
</ReadLinesFromFile>
<!-- NOTE: If update.sql is emtpy, the two databases are same -->
<Message Text="$(UpdateSql)" Condition="'$(UpdateSql)' != ''" />
<Error Text="Soure database is different from the target" Condition="'$(UpdateSql)' != ''" />
</Target>
</Project>
注意:此例中SqlSchemaComapreTask的屬性目前已最佳化,用以確保在資料庫相同時產生的update.sql是空的,並以此來判斷兩個資料庫是否相等。這個任務用來產生升級指令碼的,這裡只用於比較兩個資料庫是否結構相同。
資料庫資料比較的MsBuild任務如此例:<Project DefaultTargets="DataCompare" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<UsingTask TaskName="SqlDataCompareTask" AssemblyName="Microsoft.VisualStudio.TeamSystem.Data.PowerTools.Tasks, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"/>
<Target Name ="DataCompare">
<SqlDataCompareTask
SourceConnectionString="server=product;user id=sa;password=mypass"
SourceDatabaseName="Northwind"
TargetConnectionString="Data Source=.;Integrated Security=True;Pooling=False"
TargetDatabaseName="Northwind"
OutputPath = "."
OutputFileName = "TestDataCompare.sql"
TrimTrailingSpaces="true"
DisableTriggers="true"
DisableKeys="false"
DoNotOutputCommentHeader="true"
DoNotUseTransactions="true" />
</Target>
</Project>
Update 20060617
最終我選定了Java下的liquibase作為資料庫比較、升級、部署的工具,已應用在資料庫持續整合開發項目中(參見方法和流程),感覺不錯,唯一缺憾就是暫時還不支援.Net