上下文
最近的一个项目,使用的数据库是 MS SQLServer,每次要发布新版本时,需要把开发环境的库(我们称为template库)生成脚本(表结构+基础数据),此脚本会被放到发布包中,以便在产生环境利用这个脚本生成数据库。
可以通过SQLServer的管理工具(Microsoft SQL Server Management Studio)生成脚本,如下:
然后就是一步一步的设置,最终生成脚本,比较繁琐,且每次重复这样的过程很是浪费时间。再有,我打算以后在持续集成中自动生成脚本并打包,微软没有提供这样的命令行工具。
所以,我就利用 smo 相关的库自己写一个小工具,来实现数据库导出功能。
功能
- 可以导出数据库结构(schema)脚本
- 可以导出数据(data)脚本
- 可以选择 schema 和 data 在同一个脚本文件中,或者两个单独的脚本文件
下载地址:https://pan.baidu.com/s/1mjUFqOC
解压后,可以看到 mssql-dump-ui.exe,mssql-dump-console.exe,下面分别介绍这两个工具:
mssql-dump-ui.exe
双击此exe,会弹出如下界面:
填写好数据库连接参数后,即可点击 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 中可以查看该命令行的帮助信息:
示例:
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 一下哦