在上一篇專案管理實踐【五】自動編譯和發布網站中,我們講解了如何使用MSBuild+Robocopy+WebDeployment來自動編譯和部署網站,今天,我們來看一下,如何使用MSBuild +SVN來自動同步資料庫。
首先,將我們項目中的資料庫檔案和資料庫記錄檔放到某個目錄下,這裡放到StartKitDB目錄下,然後在該目錄下建立一個名為StartKitDB的文字檔,修改副檔名為proj,實際上,在理論上任何副檔名都可以,然後,使用記事本或其他程式開啟檔案,將下面的內容複寫到其中,儲存。
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="All" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<!-- 需要引入MSBuild Community Tasks -->
<Import Project="$(MSBuildExtensionsPath)\MSBuildCommunityTasks\MSBuild.Community.Tasks.Targets"/>
<PropertyGroup>
<!--資料庫連接字串,可以根據需要修改-->
<ConnectionString>Server=.;Integrated Security=True</ConnectionString>
</PropertyGroup>
<ItemGroup>
<!--資料庫檔案-->
<DBFiles Include="StartKitDB.mdf;StartKitDB_log.ldf"/>
</ItemGroup>
<Target Name="ALL">
<!--重啟SqlServer服務-->
<ServiceController ServiceName="mssqlserver" Action="Restart" />
<!--分離資料庫-->
<Exec Command="OSQL -S . -E -n -Q "EXEC sp_detach_db 'StartKitDB','True'"" IgnoreExitCode="false" />
<!--停止SqlServer服務-->
<ServiceController ServiceName="mssqlserver" Action="Stop" />
<!--刪除舊版本的資料庫檔案-->
<Delete Files="C:\StartKitDB\$(DBFiles)" />
<!--複製最新版本的資料庫檔案到指定位置-->
<Copy SourceFiles="@(DBFiles)" DestinationFolder="C:\StartKitDB" />
<!--啟動SqlServer服務-->
<ServiceController ServiceName="mssqlserver" Action="Start" />
<!--附加複製過來的最新版本的資料庫檔案到資料庫中-->
<Exec Command="OSQL -S . -E -n -Q "EXEC sp_attach_db @dbname = N'StartKitDB',@filename1 = N'C:\StartKitDB\StartKitDB.mdf', @filename2 = N'C:\StartKitDB\StartKitDB_log.ldf'"" IgnoreExitCode="false" />
</Target>
</Project>
當然了,如果我們希望:當我們提交最新的資料庫檔案和記錄檔到伺服器後,自動從伺服器分離舊版本的資料庫,同時附加最新版本的資料庫,那麼我們就要藉助CCNET和SVN伺服器,所以我們首先要把存放資料庫檔案、記錄檔及StartKitDB.proj檔案的StartKitDB檔案夾,納入到我們的版本控制中。但是,如果我們簡單的把這個檔案添加到我們的StartKit項目的程式碼程式庫中,那麼,當我們提交資料庫更新時,就會自動編譯整個StartKit項目,而這時候,我們項目可能並沒有更新,所以我們要把資料庫和項目分開為二個程式碼程式庫。
我們按照在專案管理實踐教程二、原始碼控制 中的講解,使用VisualSVN Server添加一個程式碼程式庫【Repository】StartKitDB,然後,使用TortoiseSVN把上面的三個檔案遷入到SVN伺服器上,最後,按照專案管理實踐【三】每日構建 的講解,在CCNET上添加一個項目【Project】,一定根據實際情況修改相應的檔案路徑,把tasks的子節點msbuild下的projectFile節點值配置為我們上面建立的StartKitDB.proj檔案。
注意:你在CCNET中配置把SVN伺服器上的資料庫檔案遷出的位置不要和上面的StartKitDB.proj檔案中的位置相同,具體原因嘛。你可以先自己想想。
OK,搞定啦。你可以提交一次資料庫到SVN伺服器,試試看有沒有效果,怎麼樣。成功了吧。嘿嘿…
這種方法適合在開發過程中使用,如果我們已經部署了項目或者已經交付給了使用者,那麼使用者可能已經添加和更新的很多資料,此時和我們開發時在SVN上的最新版本也不一致了,這時候考慮到使用者資料的安全,我們可能需要給使用者的是資料庫更新指令碼,而且要保證使用者的資料安全,那麼這時候,怎麼辦呢。我在Visual Studio 2008中如何比較二個資料庫的架構【Schema】和資料【Data】並同步做了比較詳細的講解,大家可以做個參考。
如果你對我講解的這些內容不熟悉,建議你從頭開始看這個系列的教程:專案管理實踐系列教程。