上下文
最近的一個項目,使用的數據庫是 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 一下哦
