數據庫版本控制
1) 開發版本控制。控制多人同時修改數據庫產生的沖突,使用SQL Source Control 工具做版本管理。
SQL Server Management Studio支持VSS和TFS等作為數據庫腳本的版本控制工具。
關於SQL Source Control,參考以下地址 http://www.red-gate.com/products/sql-development/sql-source-control/
2) 部署版本控制。將所有涉及數據庫表結構變動的地方保存為SQL語句,依次用文件編號順序編寫。
比如,系統參數表增加一個文件傳輸方式的字段,參考下面的腳本:
--文件傳輸模式 XCOPY,FTP,HTTP IF NOT EXISTS(SELECT C.NAME FROM DBO.SYSCOLUMNS C, DBO.SYSOBJECTS O WHERE O.ID = C.ID AND O.NAME = 'CompanyParameter' AND C.NAME = 'FileTransmissionMode') BEGIN Alter Table CompanyParameter ADD FileTransmissionMode nvarchar(1) NULL END GO
將這些積累起來的數據變更腳本DML保存到一個帶版本編號的SQL文件中,比如REV1710.sql。1710表示版本號,它的文件內容應該是這樣的:
EXEC CheckVersion 'REV1710' Go --文件傳輸模式 XCOPY,FTP,HTTP IF NOT EXISTS(SELECT C.NAME FROM DBO.SYSCOLUMNS C, DBO.SYSOBJECTS O WHERE O.ID = C.ID AND O.NAME = 'CompanyParameter' AND C.NAME = 'FileTransmissionMode') BEGIN Alter Table CompanyParameter ADD FileTransmissionMode nvarchar(1) NULL END GO EXEC UpdateVersion 'REV1710' Go
這個文件的設計模式包含三部分內容:
1) 檢查版本,檢測當前數據庫的版本是否是REV1709,不允許跳過版本升級。
2) 執行更新語句,更新數據庫。
3) 修改當前數據庫的版本為REV1710。
數據庫中的版本表定義如下,包含版本名稱和升級日期:
CREATE TABLE [dbo].[Version]( [Recnum] [DECIMAL](18, 0) IDENTITY(1,1) NOT NULL, [Version] [NVARCHAR](8) NOT NULL, [ApplyDate] [DATETIME](50) NULL CONSTRAINT [PK_AgentConfiguration] PRIMARY KEY CLUSTERED ( [Version] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY]
程序版本控制
定義一個版本常量類型,用於所有程序集共享此版本變量。
public sealed class AssemblyVersion { public const string Major = "2"; public const string Minor = "4"; public const string Build = "0"; public const string Revision = "0"; public const string Version = Major + "." + Minor + "." + Build + "." + Revision; }
修改所有項目的版本信息文件AssemblyInfo.cs,設置版本信息為定義的常量值。
[assembly: System.Reflection.AssemblyFileVersion(AssemblyVersion.FileVersion)] [assembly: System.Reflection.AssemblyVersion(AssemblyVersion.Version)]
1 在程序啟動時,檢查程序當前目錄中的程序集版本,發現不一致的程序集則應該拋出異常,停止啟動程序。
private static void VerifyAssembliesVersion() { string[] files = Directory.GetFiles(Application.StartupPath, "Enterprise.*.dll", SearchOption.TopDirectoryOnly); Parallel.ForEach<string>(files, file => { FileVersionInfo fileVersion = FileVersionInfo.GetVersionInfo(file); if (string.CompareOrdinal(fileVersion.FileVersion, AssemblyVersion.FileVersion) != 0) { throw new AppException(string.Format("File version mismatch detected\r\nFile: {0}\r\nRequired Version: {1}\r\nCurrent Version: {2}", new object[] { file.Replace(Application.StartupPath + "\\", ""), AssemblyVersion.FileVersion, fileVersion.FileVersion })); } }); }
2 登入時,檢測客戶端程序的版本是否與服務器端的版本一致。C/S架構的程序,Client登入操作要判斷Server端版本是否一致,不一致需要拋出異常,終止登入。
3 功能的窗體基類檢查版本,在這里也可以做與版本相關的簽名判斷。
private void VerifyAssembly() { //System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a startIndex = fullName.LastIndexOf("Version"); version = fullName.Substring(startIndex, 15); versionNumber = str.LastIndexOf("Version"); str = str.Substring(num2, 15); startIndex = fullName.LastIndexOf("PublicKeyToken"); publickToken = fullName.Substring(startIndex, 31); num2 = str.LastIndexOf("PublicKeyToken"); publickToken = str.Substring(num2, 31); }
取出程序集的全名(Assembly.GetCallingAssembly().FullName),逐個字符串判斷版本是否一致。
4 對於特殊類型的程序集,比如工作流,.NET CLR程序集,版本保持為永久一致。這兩種類型的程序集需要序列化並存儲到數據庫中,當程序集在更新版本時,這類數據不會被修改。如果版本有變化,會導致找不到程序集錯誤。
<WorkflowEntity WorkflowName="WFI001" Assembly="BusinessLogic, Version=5.5.0.0, Culture=neutral, PublicKeyToken=ea0fbbdb0910eab3" Type="BusinessLogic.EntityClasses.WorkflowEntity"><Fields><WorkflowName><CurrentValue Type="System.String">WFI001</CurrentValue><DbValue Type="System.String">WFI001</DbValue><IsChanged>False</IsChanged><IsNull>False</IsNull></WorkflowName><Description><CurrentValue Type="System.String">本日安全庫存量</CurrentValue><DbValue Type="System.String">本日安全庫存量</DbValue><IsChanged>False</IsChanged><IsNull>False</IsNull></Description><TableName><CurrentValue Type="System.String"></CurrentValue><DbValue Type="System.String"></DbValue><IsChanged>False</IsChanged><IsNull>False</IsNull></TableName><WorkflowType>
在這個工作流定義中(XOML),版本是5.5.0.0,當升級到新的工作流版本后加載此工作流定義文件(XOML)會報錯。
BusinessLogic, Version=5.5.0.0, Culture=neutral, PublicKeyToken=ea0fbbdb0910eab3
.NET CLR開發的SQL Server程序集也應按遵循此方法,使用固定的版本號。
5 不同的.NET編譯版本,需要附帶相應的程序集緩存或安裝工具。
InstallUtil.exe 用於安裝.NET程序集到系統服務中。
GACUTIL.EXE 用於將.NET程序安裝到系統全局緩存中。
可以通過配置文件在運行時將舊版本的文件重定向到新版本,參考下面的配置節。
<runtime> <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> <dependentAssembly> <assemblyIdentity name="ICSharpCode.SharpZipLib" publicKeyToken="1B03E6ACF1164F73" culture="neutral"/> <bindingRedirect oldVersion="0.0.0.0-0.86.0.518" newVersion="0.86.0.518"/> </dependentAssembly> </assemblyBinding> </runtime>