MS SQLServer 数据库导出工具

上下文


最近的一个项目,使用的数据库是 MS SQLServer,每次要发布新版本时,需要把开发环境的库(我们称为template库)生成脚本(表结构+基础数据),此脚本会被放到发布包中,以便在产生环境利用这个脚本生成数据库。
可以通过SQLServer的管理工具(Microsoft SQL Server Management Studio)生成脚本,如下:
MS SQLServer 数据库导出工具

然后就是一步一步的设置,最终生成脚本,比较繁琐,且每次重复这样的过程很是浪费时间。再有,我打算以后在持续集成中自动生成脚本并打包,微软没有提供这样的命令行工具。
所以,我就利用 smo 相关的库自己写一个小工具,来实现数据库导出功能。

功能


  • 可以导出数据库结构(schema)脚本
  • 可以导出数据(data)脚本
  • 可以选择 schema 和 data 在同一个脚本文件中,或者两个单独的脚本文件

下载地址:https://pan.baidu.com/s/1mjUFqOC
解压后,可以看到 mssql-dump-ui.exemssql-dump-console.exe,下面分别介绍这两个工具:

mssql-dump-ui.exe


双击此exe,会弹出如下界面:
MS SQLServer 数据库导出工具

填写好数据库连接参数后,即可点击 Dump 按钮导出脚本,之后选择一个文件夹,作为脚本的输出目录,脚本的名称规则如下:

  • 如果没有勾选 seperate schema and data, 则最终的脚本名称为 [DbName].sql,比如 test.sql
  • 如果勾选了 seperate schema and data,则最终的脚本名称为: [DbName]–schema.sql, [DbName]–data.sql. 比如 test-schema.sql, test-data.sql

脚本导出完成后,会自动打开输出目录。

mssql-tool-console.exe


命令行工具,在 cmd shell 中可以查看该命令行的帮助信息:
MS SQLServer 数据库导出工具

示例:
mssql-dump-console -s .\sqlexpress -u sa -p password1 -i test -d -o d:/test_script
等同于:
mssql-dump-console --server=.\sqlexpress --userid=sa --password=password1 --dbname=test --include-data --output-dir=d:/test_script

核心代码


public void GenerateSchema(DbInfo dbInfo, TextWriter textWriter)
        {
            var serverConn = new ServerConnection(dbInfo.Server, dbInfo.UserId, dbInfo.Password);
            Server srv = new Server(serverConn);
            Database db = srv.Databases[dbInfo.DbName];
            if (db == null)
            {
                throw new Exception($"Database {dbInfo.DbName} not exists.");
            }

            Scripter scripter = new Scripter(srv);

            scripter.Options.NoCollation = true;
            scripter.Options.Indexes = true;
            scripter.Options.ClusteredIndexes = true;
            scripter.Options.NonClusteredIndexes = true;
            scripter.Options.DriAll = true;
            scripter.Options.DriAllConstraints = true;

            scripter.Options.Triggers = true;
            scripter.Options.FullTextIndexes = true;

            scripter.Options.AllowSystemObjects = false;
            scripter.Options.WithDependencies = false;

            scripter.Options.TargetDatabaseEngineEdition = DatabaseEngineEdition.Standard;
            scripter.Options.TargetDatabaseEngineType = DatabaseEngineType.Standalone;

            scripter.Options.ExtendedProperties = true;

            scripter.Options.ScriptDrops = false;
            scripter.Options.ScriptSchema = true;
            scripter.Options.ScriptData = false;

            textWriter.WriteLine("-----------------------------------------");
            textWriter.WriteLine("-----------------schema------------------");
            textWriter.WriteLine("-----------------------------------------");
            foreach (Urn table in getTableUrnWithDependence(db))
            {
                System.Collections.Specialized.StringCollection sc = scripter.Script(new Urn[] { table });
                foreach (string st in sc)
                {
                    Console.WriteLine(st);
                    textWriter.WriteLine(st);
                    textWriter.WriteLine("GO");
                }
            }
        }

源码


源码:https://github.com/junejs/mssql-dump.git
如果这个工具帮到了你,记得在 github star 一下哦

MS SQLServer 数据库导出工具

上一篇:为什么MySQL要用B+树?聊聊B+树与硬盘的前世今生【宇哥带你玩转MySQL 索引篇(二)】


下一篇:jQuery常用dom操作