• 如何使用SSDT进行SQL数据库的自动化部署到生产环境和版本控制


    简介

    在开发过程,我们常常会遇到数据库环境部署的问题,当部署正式环境中,数据库产生的多文件脚本在管理上就容易出现混乱,特别是你还没有权限访问正式环境的情况,就更为困难。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[0].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 Server120DACin

    如果使用的是VS2012或者最低版本的VS,路径C:Program Files (x86)Microsoft SQL Server110DACin,因为SSDT最新版本为了避免与VS的目录发生冲突进而将安装目录放于120。

  • 相关阅读:
    【linux基础】usleep和sleep的区别
    【算法基础】opencv函数approxPolyDP和Ramer-Douglas-Peucker Algorithm
    【算法基础】散点轮廓算法-Alpha Shapes
    【图像处理算法基础】图像分割经典算法-泛洪算法FloodFill
    .net core 部署在Linux系统上运行的环境搭建
    Linux部署Net Core网站,三种自定义绑定端口号的方法(UseUrls,UseKestrel,手动指定)
    .NetCore部署Linux环境搭建
    .Net Core 项目发布到Linux
    .Net Core 项目发布到Linux
    Linux桌面操作系统排行榜
  • 原文地址:https://www.cnblogs.com/ruanyifeng/p/5177316.html
Copyright © 2020-2023  润新知