【问题标题】:Extract Azure SQL Database using DataTools utility使用 DataTools 实用程序提取 Azure SQL 数据库
【发布时间】:2019-08-28 14:47:49
【问题描述】:
我想使用 VS2017 Data-Tools 编写一个实用程序,该实用程序将提取 Azure Sql 数据库并在本地文件存储上创建 dacpac。
我知道我可以使用 SQL Server 对象资源管理器并从中提取信息,但我想编写一个 c# 可执行文件来为我做同样的事情,这样我就可以自动化它并安排它每周发生一次。
我需要能够排除一些表,但除此之外它是一个直接的提取。这可能吗,有没有我可以用来开始的例子?抱歉,这对我来说是全新的,所以不知道从哪里开始。
【问题讨论】:
标签:
azure
visual-studio-2017
extract
sql-server-data-tools
【解决方案1】:
找到适合我的解决方案:
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data.SqlClient;
using Microsoft.SqlServer.Dac;
private static string excludeSchemas = ConfigurationManager.AppSettings["ExcludeSchemas"];
private static string excludeTables = ConfigurationManager.AppSettings["ExcludeTables"];
private static string TableQuery = "SELECT SCHEMA_NAME(schema_id), name FROM sys.tables where SCHEMA_NAME(schema_id) not in ({0} ) and name not in ({1}) order by schema_id,name";
static void Main(string[] args)
{
Extract();
}
private static void Extract()
{
var sourceConnectionString = ConfigurationManager.AppSettings["SourceDbConnection"];
DacServices svc = new DacServices(sourceConnectionString);
DacExtractOptions dacExtractOptions = new DacExtractOptions
{
ExtractApplicationScopedObjectsOnly = true,
ExtractReferencedServerScopedElements = false,
VerifyExtraction = false,
Storage = DacSchemaModelStorageType.Memory
};
var tables = BuildTables();
var dacPacDest = ConfigurationManager.AppSettings["DacPacDestination"];
var sourceDb = ConfigurationManager.AppSettings["sourceDbName"];
svc.Extract(dacPacDest,sourceDb, "Sample DACPAC", new Version(1, 0, 0), "Sample Extract", tables, dacExtractOptions);
}
private static IEnumerable<Tuple<string, string>> BuildTables()
{
var tbls = new List<Tuple<string, string>>();
var tblConnection = ConfigurationManager.AppSettings["SourceDbConnection"];
using (SqlConnection connection = new SqlConnection(tblConnection))
{
connection.Open();
string query = string.Format(TableQuery, excludeSchemas, excludeTables);
using (SqlCommand command = new SqlCommand(query, connection))
{
using (SqlDataReader reader = command.ExecuteReader())
{
while (reader.Read())
{
tbls.Add(new Tuple<string, string>(reader.GetString(0), reader.GetString(1)));
}
}
}
}
return tbls;
}