SQL SERVER data tier application 的作用及如何使用SSDT进行SQL数据库的自动化部署到生产环境和版本控制
這個(gè)是管理員用來(lái)發(fā)布數(shù)據(jù)庫(kù)所有的腳本用的,自SQL2008以后,微軟開(kāi)始將數(shù)據(jù)庫(kù)的開(kāi)發(fā)整合到VS2010上,用戶(hù)可以將數(shù)據(jù)所有的相關(guān)對(duì)象打包成一個(gè)DAC包,讓管理通過(guò)extract data-tier application發(fā)布到服務(wù)器上。就好像你把代碼變成dll去發(fā)布一樣,而不用管里面寫(xiě)的內(nèi)容。register as data-tier appliccation 反之亦然。
?
簡(jiǎn)介
在開(kāi)發(fā)過(guò)程,我們常常會(huì)遇到數(shù)據(jù)庫(kù)環(huán)境部署的問(wèn)題,當(dāng)部署正式環(huán)境中,數(shù)據(jù)庫(kù)產(chǎn)生的多文件腳本在管理上就容易出現(xiàn)混亂,特別是你還沒(méi)有權(quán)限訪問(wèn)正式環(huán)境的情況,就更為困難。SSDT為我們提供了很好的解決方案。
SSDT: Sql Server Data Tool,數(shù)據(jù)庫(kù)工具,這里主要針對(duì)其作用于數(shù)據(jù)庫(kù)版本控制的功能。
在VS中,SSDT主要添加了兩項(xiàng)功能:SQL Server Database Project和DACPAC(Data-Tier Application Package)
簡(jiǎn)單介紹下DACPAC,DACPAC文件包含整個(gè)數(shù)據(jù)庫(kù)的信息和SQL相關(guān)的查詢(xún)數(shù)據(jù)。當(dāng)部署新版本數(shù)據(jù)庫(kù)到一個(gè)文件中時(shí),DACPAC類(lèi)似于備份功能,會(huì)將數(shù)據(jù)部署到每一張表中。
SQL Server DataBase Project
顧名思義,SSDP就是一個(gè)SQL數(shù)據(jù)庫(kù)的項(xiàng)目。添加一個(gè)數(shù)據(jù)庫(kù)項(xiàng)目,可以導(dǎo)入相關(guān)的數(shù)據(jù)庫(kù)信息,如存儲(chǔ)過(guò)程、試圖等等。還可以擁有DACPAC文件,用于備份和版本控制功能。
如何添加?
1、在項(xiàng)目中添加SQL Server Database Project
2、將數(shù)據(jù)庫(kù)導(dǎo)入到項(xiàng)目中
3、創(chuàng)建Data文件夾以及部署后執(zhí)行的“PostDeployment”Sql腳本。創(chuàng)建后,SSDT還提供一系列的功能便于對(duì)比,如語(yǔ)法、數(shù)據(jù)對(duì)比等。
數(shù)據(jù)庫(kù)的發(fā)布
SSDT提供多種發(fā)布部署的方法
首先先介紹下如果生成DACPAC文件,在數(shù)據(jù)庫(kù)項(xiàng)目中,右鍵“Snapshot Project”,將會(huì)生成當(dāng)前數(shù)據(jù)庫(kù)的版本,存在于文件夾Snapshots下,如下圖
其次關(guān)于部署DACPAC方式也包含兩種:
a. 通過(guò)Sql Server 2012的Tasks里的Upgrade DACPAC功能實(shí)現(xiàn)
?
b. 通過(guò)運(yùn)行Code方式實(shí)現(xiàn)
如果在MVC項(xiàng)目下,你可以將code寫(xiě)于Global.asax的Application_Start方法下,這里舉例用新建Console Application的方式執(zhí)行。
在Proram下,我們添加入下代碼
1. 針對(duì)單個(gè)DACPAC文件部署到正式環(huán)境。
?
class Program{static void Main(string[] args){try{//1. 單個(gè)DACPAC文件的部署const string ConnectionStringName = "Data Source=.;initial catalog=Template;Integrated Security=True;";//可以寫(xiě)到app.config中var dacPackage = DacPackage.Load(ConnectionStringName);var dacServices = new DacServices(ConnectionStringName);var targetDatabaseName = (new SqlConnectionStringBuilder(ConnectionStringName)).InitialCatalog;dacServices.Deploy(dacPackage, targetDatabaseName, true);}catch (Exception ex){Console.WriteLine(ex.ToString());}Console.WriteLine("<Press any key to exit.>");Console.ReadKey();} }?
2. 針對(duì)Snapshots下多個(gè)DACPAC文件一鍵部署,則需要對(duì)比數(shù)據(jù)庫(kù)快照的版本號(hào),部署最新版本
?
//2. Snapshots文件夾下多個(gè)DACPAC文件的部署,通過(guò)遍歷需要判斷版本號(hào)部署const string SnapshotFolder = "Snapshots";foreach (var dacpacFileName in Directory.GetFiles(SnapshotFolder, "*.dacpac").OrderBy(name => name)){var databaseVersion = GetCurrentDacVersionFromDatabase(ConnectionStringName);if (dacPackage.Version <= databaseVersion){continue;}var dacDeployOptions = new DacDeployOptions { RegisterDataTierApplication = true };dacServices.Deploy(dacPackage, targetDatabaseName, true, dacDeployOptions);}?
需要一個(gè)方法來(lái)判斷當(dāng)前的版本號(hào)
?
private static Version GetCurrentDacVersionFromDatabase(string connectionString){var returnValue = new Version();const string SqlStatement = "SELECT TOP 1 type_version FROM msdb.dbo.sysdac_instances_internal WHERE instance_name = db_name()";try{using (var connection = new SqlConnection(connectionString)){connection.Open();using (var command = new SqlCommand(SqlStatement, connection)){using (var reader = command.ExecuteReader()){if (reader.Read()){var stringVersion = reader[0].ToString();Version.TryParse(stringVersion, out returnValue);}}}}}catch{}return returnValue;}小結(jié)和注意事項(xiàng)
1、在做部署的時(shí)候,應(yīng)記得在本地備份一個(gè)數(shù)據(jù)庫(kù)
2、需要有文檔,注釋升級(jí)了哪些數(shù)據(jù)庫(kù)內(nèi)容
3、”P(pán)ublish”用于可以連接數(shù)據(jù)庫(kù),DACPAC部署用于無(wú)權(quán)限連接數(shù)據(jù)庫(kù)
4、在用Code部署DACPAC文件的時(shí)候,需要注意判斷下版本號(hào)
5、SSDT的安裝目錄 C:\Program Files (x86)\Microsoft SQL Server\120\DAC\bin\
如果使用的是VS2012或者最低版本的VS,路徑C:\Program Files (x86)\Microsoft SQL Server\110\DAC\bin\,因?yàn)镾SDT最新版本為了避免與VS的目錄發(fā)生沖突進(jìn)而將安裝目錄放于120。
總結(jié)
以上是生活随笔為你收集整理的SQL SERVER data tier application 的作用及如何使用SSDT进行SQL数据库的自动化部署到生产环境和版本控制的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 可转债存在哪些优势?主要在四个方面
- 下一篇: 第十节: 利用SQLServer实现Qu