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