[SQLServer]NetCore中将SQLServer数据库备份为Sql脚本
NetCore中将SQLServer数据库备份为Sql脚本
描述:
最近写项目收到了一个需求, 就是将SQL Server数据库备份为Sql脚本, 如果是My Sql之类的还好说, 但是在网上搜了一大堆, 全是教你怎么操作SSMS的, 就很d疼!
解决方案:
通过各种查找资料, 还有一些老哥的帮助, 找到了解决方案:
通过Microsoft.SqlServer.Management.Smo, Microsoft.SqlServer.Management.Sdk.Sfc, Microsoft.SqlServer.Management.Common来解决, 但是不巧的是, 这个方法可能只适用于.Net Framework, 并且微软已经提供一个合集的类库封装为Microsoft.SqlServer.Scripts. 但是我是一个Net5的项目!
但是最后还是找到了, 微软封装了一个其它包...emmMicrosoft.SqlServer.SqlManagementObjects, 此类库可以适用于Net Core.
By: 胖纸不争
NetCore群: 743336452
基本使用
Server server = new Server(
new ServerConnection(
// 服务器IP
_dbBackupOptions.ServerInstance,
// 登录名
_dbBackupOptions.Username,
// 密码
_dbBackupOptions.Password
)
);
// 获取数据库
Database templateDb = server.Databases[_dbBackupOptions.DatabaseName];
// 脚本导出路径
string sqlFilePath = string.Format("{0}.sql", $"{dbBackupPath}/{name}");
// 自定义规则
var startWith = _dbBackupOptions.FormatTables.Where(x => x.EndsWith("*")).Select(x => x.TrimEnd('*'));
var endWith = _dbBackupOptions.FormatTables.Where(x => x.StartsWith("*")).Select(x => x.TrimStart('*'));
if (_dbBackupOptions.FormatTables is not null && _dbBackupOptions.FormatTables.Any())
{
foreach (Table tb in templateDb.Tables)
{
if (_dbBackupOptions.FormatTables.Contains(tb.Name) ||
startWith.Where(x => tb.Name.StartsWith(x)).Any() ||
endWith.Where(x => tb.Name.EndsWith(x)).Any())
{
// 按表获取Sql
IEnumerable<string> sqlStrs = tb.EnumScript(_dbBackupOptions.ScriptingOptions);
// 将Sql向文件中追加
using (StreamWriter sw = new StreamWriter(sqlFilePath, true, Encoding.UTF8))
{
foreach (var sql in sqlStrs)
{
sw.WriteLine(sql);
sw.WriteLine("GO");
}
}
}
}
}
else
{
foreach (Table tb in templateDb.Tables)
{
IEnumerable<string> sqlStrs = tb.EnumScript(_dbBackupOptions.ScriptingOptions);
using (StreamWriter sw = new StreamWriter(sqlFilePath, true, Encoding.UTF8))
{
foreach (var sql in sqlStrs)
{
sw.WriteLine(sql);
sw.WriteLine("GO");
}
}
}
}
开箱即用(封装库Powers.DbBackup)
我针对这个封装了一个类库, Powers.DBackup方便简单使用.
GitHub地址: Powers.DbBackup
配置DbBackup
1. In Startup.cs(Net5):
services.AddDbBackup();
appsettings.json:
"DbBackupOptions": {
// remote server
"ServerInstance": "192.168.31.36",
// database username
"Username": "sa",
// password
"Password": "sa123.",
// ddatabase name
"DatabaseName": "PumInfoShop",
// output options
"ScriptingOptions": {
"DriAll": false,
"ScriptSchema": true,
"ScriptData": true,
"ScriptDrops": false
},
// match rules
/**
* Include 3 rules:
* 1. Full name: UserTable
* 2. Start with: Sys*
* 3. End with: *Table
*/
"FormatTables": []
}
OR
services.AddDbBackup(opts =>
{
opts.ServerInstance = "127.0.0.1";
opts.Username = "sa";
opts.Password = "123456";
opts.DatabaseName = "TestDb";
opts.ScriptingOptions = new ScriptingOptions
{
DriAll = true,
ScriptSchema = true,
ScriptData = true,
ScriptDrops = false
};
/**
* Include 3 rules:
* 1. Full name: UserTable
* 2. Start with: Sys*
* 3. End with: *Table
*/
opts.FormatTables = new string[] { "Sys*", "Log*", "UserTable", "*Table" };
});
// Or this way
//services.AddDbBackup(opts => new DbBackupOptions
//{
// ServerInstance = "127.0.0.1",
// Username = "sa",
// // .....
//});
2. In Program.cs(Net6):
builder.Services.AddDbBackup();
appsettings.json:
"DbBackupOptions": {
"ServerInstance": "192.168.31.36",
"Username": "sa",
"Password": "sa123.",
"DatabaseName": "PumInfoShop",
"ScriptingOptions": {
"DriAll": false,
"ScriptSchema": true,
"ScriptData": true,
"ScriptDrops": false
},
"FormatTables": []
}
OR
builder.Services.AddDbBackup(opts =>
{
opts.ServerInstance = "127.0.0.1";
opts.Username = "sa";
opts.Password = "123456";
opts.DatabaseName = "TestDb";
opts.ScriptingOptions = new ScriptingOptions
{
DriAll = true,
ScriptSchema = true,
ScriptData = true,
ScriptDrops = false
};
/**
* Include 3 rules:
* 1. Full name: UserTable
* 2. Start with: Sys*
* 3. End with: *Table
*/
opts.FormatTables = new string[] { "Sys*", "Log*", "UserTable", "*Table" };
});
// Or this way
//builder.Services.AddDbBackup(opts => new DbBackupOptions
//{
// ServerInstance = "127.0.0.1",
// Username = "sa",
// // .....
//});
使用方法
[HttpGet]
public async Task<ActionResult> StartDbBackup()
{
var rootPath = "D:/";
var fileName = DateTime.Now.ToString("yyyyMMddhhmmss"); // No ".sql" suffix is required.
var (path, size) = await DbBackupExtensions.StartBackupAsync(rootPath, fileName);// path is full path
return Ok(new
{
Path = path,
Size = size
});
}
[HttpGet]
public async Task<ActionResult> DeleteDbBackup(string filePath)
{
var (res, msg) = await DbBackupExtensions.DeleteBackup(filePath);
if (res)
{
return Ok(msg);
}
else
{
return NotFound(msg);
}
}
[SQLServer]NetCore中将SQLServer数据库备份为Sql脚本的更多相关文章
- 数据库备份及SQL脚本导入
数据库备份及SQL脚本导入 数据导出 su - oracle exp 数据库用户名/数据库密码@ORCL file=20190905.dmp full=y SQL脚本导入 首先导入前查看Oracle用 ...
- [SQL SERVER] - 还原数据库备份(SQL脚本),抛出 "System.OutOfMemoryException" 异常之解决
背景 在 Microsoft SQL Server 2016 的查询窗体中,直接还原备份数据库的 SQL 脚本(99MB),抛出 Cannot execute script 异常: 原因 相关资料说: ...
- .net(C#)在Access数据库中执行sql脚本
自己写的一个工具类,主要是业务场景的需要. 主要有两个功能: ①执行包含sql语句的字符串 ②执行包含sql语句的文件 调用方式 /// <summary> /// 执行sql语句 /// ...
- SQL server 数据库备份还原Sql
/************ 一.数据库备份 ************/ --完整备份默认追加到现有的文件 backup database DBXS To disk='d:\backup\DBXS_fu ...
- sqlserver2008数据库自动备份的sql脚本及使用bat命令执行脚本
-----sql脚本 declare @fileName varchar(255) ,--定义备份文件名变量 @dbname varchar(255)--定义备份数据库名变量decla ...
- SQL Server2019数据库备份与还原脚本,数据库可批量备份
前言 最近公司服务器到期,需要进行数据迁移,而数据库属于多而繁琐,通过图形化界面一个一个备份所需时间成本很大,所以想着写一个sql脚本来执行. 开始 数据库单个备份 数据库批量备份 数据库还原 数据库 ...
- linux系统下mySQL数据库 备份方法和脚本
数据库备份1.创建个备份存储目录mkdir /root/backup/2.以下内容写到dbbackup.sh #!/bin/bash cd /data/db_backup/mysqldump -uad ...
- MySQL必知必会-官方数据库表及SQL脚本导入生成
最近在复习SQL语句,看的是MySQL必知必会这本书,但是发现附录中只有表设计,没有表的具体数据.所以在学习相应的语句中体验不是很好,去网上查了数据库的内容,自己慢慢导入到了数据库中.把表放出来作为参 ...
- 使用PD(PowerDesigner)图如何快速生成创建数据库表的SQL脚本
打开PD软件: 1.新建概念模型(conceptual Data Model) File-->New Model-->Conceptual Data Mode 或者点击工作区,右键--&g ...
随机推荐
- 使用Visual Studio查看C++类内存分布
书上类继承相关章节到这里就结束了,这里不妨说下C++内存分布结构,我们来看看编译器是怎么处理类成员内存分布的,特别是在继承.虚函数存在的情况下. 工欲善其事,必先利其器,我们先用好Visual Stu ...
- 电源PCB布板的10个基本法则
电容模型 电容并联高频特性 电感模型 电感特性 镜象面概念 高频交流电流环路 过孔 (VIA) 的例子 PCB板层分割 降压式(BUCK)电源:功率部分电流和电压波形 降压式电源排版差的例子 电路等效 ...
- CSS 3-浮动、定位
文档流 文档流是一种默认定位方式,在文档流中元素框的位置由元素在html中的位置决定,文档流中元素的position属性为默认的static或继承来的static并按照普通流定位.块级元素独占一行,自 ...
- css 迷惑的position
迷惑的position 小加发现实际开发中position使用频率很高,但很多人却对position不是很了解,导致开发中出现各种问题,现在让我门一起来看看这个迷惑的position吧~ static ...
- Hive启动后show tables报错:Unable to instantiate org.apache.hadoop.hive.ql.metadata.SessionHiveMetaStoreClient
错误详情: FAILED: HiveException java.lang.RuntimeException: Unable to instantiate org.apache.hadoop.hive ...
- 类其中的变量为final时的用法
类其中的变量为final时的用法: 类当中final变量没有初始缺省值,必须在构造函数中赋值或直接当时赋值.否则报错. public class Test { final int i; ...
- 深入研究const(es6特性)
const 申明常量 var str = 'es6' console.log(window.str) // es6 属于顶层对象window const不属于顶层对象window const str ...
- 如何得到个性化banner
介绍 有时候用一些脚本工具,会有一些由其他字符组成的字符.(如下面这个我还在写的) 使用 kali自带了这个工具 -- figlet. figlet AuToIP 就可以得到上面的字符啦! 另外如果想 ...
- linux中查看端口号使用情况
百度一圈,以下是整理来的操作命令. 1.netstat -anp |grep (端口号) 这个方法可以直观看到对应端口号是否被使用. 2.netstat -nultp 这个方法可以看到该机上所有以用的 ...
- 企业应用架构研究系列二十七:Vue3.0 之环境的搭建与Vue Antd Admin探索
开发前端需要准备一些开发工具,这些工具怎么安装就不详细描写了,度娘一些很多很多.主要把核心的开发工具列表一些,这些资源也是非常容易找到和安装的. Node 安装:https://nodejs.org/ ...