简介

在开发过程,我们常常会遇到数据库环境部署的问题,当部署正式环境中,数据库产生的多文件脚本在管理上就容易出现混乱,特别是你还没有权限访问正式环境的情况,就更为困难。SSDT为我们提供了很好的解决方案。

SSDT: Sql Server Data Tool,数据库工具,这里主要针对其作用于数据库版本控制的功能。

在VS中,SSDT主要添加了两项功能:SQL Server Database Project和DACPAC(Data-Tier Application Package)

简单介绍下DACPAC,DACPAC文件包含整个数据库的信息和SQL相关的查询数据。当部署新版本数据库到一个文件中时,DACPAC类似于备份功能,会将数据部署到每一张表中。

SQL Server DataBase Project

顾名思义,SSDP就是一个SQL数据库的项目。添加一个数据库项目,可以导入相关的数据库信息,如存储过程、试图等等。还可以拥有DACPAC文件,用于备份和版本控制功能。

如何添加?

1、在项目中添加SQL Server Database Project

2、将数据库导入到项目中

3、创建Data文件夹以及部署后执行的“PostDeployment”Sql脚本。创建后,SSDT还提供一系列的功能便于对比,如语法、数据对比等。

数据库的发布

SSDT提供多种发布部署的方法

  1. 如果你有权限可以通过VS直接连接SQL的,那么通过右键项目的“Publish”选项,即可以完成部署功能
  2. 如果你没有权限访问数据库,比如正式产品环境的数据库。这时候你就需要使用DACPAC进行部署

    首先先介绍下如果生成DACPAC文件,在数据库项目中,右键“Snapshot Project”,将会生成当前数据库的版本,存在于文件夹Snapshots下,如下图

    

    其次关于部署DACPAC方式也包含两种:

    a. 通过Sql Server 2012的Tasks里的Upgrade DACPAC功能实现

    

    b. 通过运行Code方式实现

    如果在MVC项目下,你可以将code写于Global.asax的Application_Start方法下,这里举例用新建Console Application的方式执行。

    

    在Proram下,我们添加入下代码

    1. 针对单个DACPAC文件部署到正式环境。

 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文件一键部署,则需要对比数据库快照的版本号,部署最新版本

//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);
}

    需要一个方法来判断当前的版本号

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[].ToString();
Version.TryParse(stringVersion, out returnValue);
}
}
}
}
}
catch
{
}
return returnValue;
}

小结和注意事项

1、在做部署的时候,应记得在本地备份一个数据库

2、需要有文档,注释升级了哪些数据库内容

3、”Publish”用于可以连接数据库,DACPAC部署用于无权限连接数据库

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的目录发生冲突进而将安装目录放于120。

如何使用SSDT进行SQL数据库的自动化部署到生产环境和版本控制的更多相关文章

  1. Greenplum 数据库安装部署(生产环境)

    Greenplum 数据库安装部署(生产环境) 硬件配置: 16 台 IBM X3650, 节点配置:CPU 2 * 8core,内存 128GB,硬盘 16 * 900GB,万兆网卡. 万兆交换机. ...

  2. 转_Greenplum 数据库安装部署(生产环境)

    Greenplum 数据库安装部署(生产环境) 硬件配置: 16 台 IBM X3650, 节点配置:CPU 2 * 8core,内存 128GB,硬盘 16 * 900GB,万兆网卡. 万兆交换机. ...

  3. Jenkins+maven+gitlab自动化部署之基础环境部署(一)

    从一个二线城市,来到上海,刚入职,老大就给任务,为了减少开发打包部署时间,需要搭建一套自动化部署环境.接到任务后,赶紧上网查找资料,以及了解jenkins作用等等,用了一周时间,了解了个大概,由于都是 ...

  4. Headless MSBuild Support for SSDT (*.sqlproj) Projects [利用msbuild自动化部署 .sqlproj]- 摘自网络

    Update: breaking change: http://sqlproj.com/index.php/2012/10/dacfx-sept-2012-updates-break-headless ...

  5. CentOS 6.5环境使用ansible剧本自动化部署Corosync + pacemaker环境及corosync常用配置详解

    环境说明: 192.168.8.39 node2.chinasoft.com 192.168.8.42 node4.chinasoft.com 192.168.8.40 ansible管理服务器 19 ...

  6. My Sql数据库设置环境变量和字符集

    一.踩坑背景 之前开发中一直用的是sql  server 数据库,最近接到公司一个老的项目,用的my sql数据库做的,功能做了一大部分,现在客户要求对原程序和数据库进行服务器的迁移工作.产品经理给出 ...

  7. Asp.net Core 使用Jenkins + Dockor 实现持续集成、自动化部署(四):发布与回滚

    写在前面 我们以前windows跑.net Framework程序的时候,发布,自己乖乖的替换程序:备份,也是自己一个一个的重命名备份:回滚,发布遇到问题的回滚更是不用说了:运维很是怕我们 这些用wi ...

  8. 运维与自动化系列③自动化部署基础与shell脚本实现

    自动化部署基础与shell脚本实现 关于自动化的基础知识: 1.1:当前代码部署的实现方式: 运维纯手工scp到web服务器纯手工登录git服务器执行git pull或svn服务器执行svn upda ...

  9. 使用_Capistrano_进行自动化部署(2)

    之前的一篇文章是为了解决问题而写的,很多东西都没有介绍清楚,这一篇文章就是完整介绍一下 Capistrano,主要的参考来源是 Modern PHP 这本书. Capistrano 是用于自动部署应用 ...

随机推荐

  1. 取消eclipse js验证

    去掉Eclipse中的Validating 最近我的Eclipse一直经常效验javascript,我疯了校验了一个多小时还是在验.我只能在项目的.project文件中: 去掉.project文件中的 ...

  2. 本地虚拟机LNMP环境安装

      首先上传源码包到linux中(本人上传到根目录中),随意上传能找到即可 一.配置YUM源(如果已经配好就不许要重新配置) 挂载光驱要挂载到/mnt下  Mount /dev/cdrom /mnt ...

  3. WPF中的数据模板使用方式之一:ContentControl、ContentTemplate和TemplateSelector的使用

    在WPF中,数据模板是非常强大的工具,他是一块定义如何显示绑定的对象的XAML标记.有两种类型的控件支持数据模板:(1)内容控件通过ContentTemplate属性支持数据模板:(2)列表控件通过I ...

  4. C语言基础知识【变量】

    C 变量1.变量其实只不过是程序可操作的存储区的名称.C 中每个变量都有特定的类型,类型决定了变量存储的大小和布局,该范围内的值都可以存储在内存中,运算符可应用于变量上.变量的名称可以由字母.数字和下 ...

  5. C语言基础知识【数据类型】

    C 数据类型1.在 C 语言中,数据类型指的是用于声明不同类型的变量或函数的一个广泛的系统.变量的类型决定了变量存储占用的空间,以及如何解释存储的位模式.2.C 中的类型可分为以下几种:序号    类 ...

  6. PHPstorm如何导入字体主题

    概要: 今天在安装phpstorm的时候发现导入字体主题时,出了问题,这个问题总是困惑我,并且曾经遇到过,没记录下来,所以想着这次记录下来吧.网上搜的稀里糊涂的,还是自己做个summary! 前提: ...

  7. 安装Hadoop 1.1.2 (二 安装配置SSH)

    1 查找SSH  yum search ssh 2 如果没有安装, yum install openssh.x86_64 4 直接运行  ssh-keygen -t dsa -P '' -f /roo ...

  8. 解决xcode5升级后,Undefined symbols for architecture arm64:问题

    The issue is that the cocoapods have not been built for arm64 architecture yet thus they cannot be l ...

  9. x^a=b(mod c)求解x在[0,c-1]上解的个数模板+原根求法

    /************************************* 求解x^a=b(mod c) x在[0,c-1]上解的个数模板 输入:1e9>=a,b>=1,1e9>= ...

  10. 装服务器,测试数据库,简单的maven命令

    [说明]今天总体回顾一下:大概是早上装服务器,下午测试数据库,晚上了解简单的maven命令 一:今日完成 1)在远程服务器的tomcat 设置好管理员的登录账号 2)登录tomcat 的项目管理 查看 ...