使用主密钥从 Azure 自动导入数据层应用程序(SQL 数据库)

Automating import of data-tier application (SQL database) from Azure with a Master Key

当我从具有主密钥的 Microsoft Azure SQL 数据库中提取数据层应用程序时,我无法将其导入本地 PC 上的 SQL 服务器。

你会发现其他人在这里遇到了这个问题:

但是,作为答案提供的步骤对我的安装不起作用。 步骤是 1.禁用服务器(或数据库)上的审计 2. 使用 DROP MASTER KEY 命令删除数据库主密钥。

Microsoft 技术支持证实此解决方案不适用于我安装的 SQL Server,并且在实际远程控制我的 PC 并排除故障后,他们无法确定发生这种情况的原因

我需要找到一种方法从 bacpac 文件中删除主密钥。我有一个 Powershell 脚本可以从 BACPAC 文件中删除主密钥,但它需要从 Windows Powershell 中提取、重命名文件和 运行 脚本来导入数据库。

有没有人有一个程序或一组脚本可以自动执行删除主密钥并使用单个命令从 Azure 导入 SQL 数据库的过程?

我是这个论坛的新手。请不要对这个 post 苛刻。我正在尽我所能帮助其他人节省我为此花费的大量时间。

我拼凑了一个 T-SQL 脚本,该脚本调用 Windows Powershell 脚本(也是从多个来源拼凑而成)以从 Microsoft Azure SQL 数据库并通过 运行ning ONE 命令将其导入我本地 SQL 服务器上的数据库。几个月来,我从其他博客等找到了我的脚本中的一些代码。由于那些人,我无法提供信用,因为我没有跟踪我从哪里获得信息。如果您正在阅读本文并看到您的代码,请相信。很抱歉无法将您的工作归功于您。

您的 PC 和本地 SQL 服务器上的配置设置可能需要调整,因为整个解决方案需要对您的计算机具有几乎完全的访问权限。如果您 运行 遇到兼容性方面的问题,请告诉我,我会尽我所能让您知道我的系统是如何配置的,以备不时之需。

我正在使用 Windows 10 Pro 和 Microsoft SQL Server Developer(64 位)v12.0.5207.0

我已将完成 GitHub 上所有工作的两个文件放在此处:https://github.com/Wingloader/Auto-Azure-BACPAC-Download.git GetNewBacpac-forGitHub.sql GetAzureDB-forGitHub.ps1


警告:Powershell 脚本文件将以明文形式存储您的 SQL sa 密码和 Azure SQL 登录名!
如果您不想这样做,请不要使用此解决方案。


我的电脑完全由我拥有和控制,所以我可以打开我系统的安全性,我愿意承担保护它的责任。

我的解决方案的基本步骤如下:(第 1 步和第 2 步是可选的,因为我想保留我正在使用的数据库的一个版本,截至我撤下干净的产品时我的 Azure 数据库的副本)

  1. 将当前数据库备份为MyLocalDB.bak。
  2. 将步骤 1 中的备份还原到新数据库,并在数据库名称末尾标记前一天(例如,MyLocalDB20171231)
  3. 删除原始的 MyLocalDB 数据库(需要这样我们稍后可以使用原始名称重新创建数据库)
  4. 从 Azure 中下载生产数据库并创建一个名为 MyLocalDB 的新数据库。

在步骤 3 中删除了原始数据库,以便恢复的数据库可以使用原始名称(当您有引用该数据库名称的数据连接时很重要)

在第4步中,从Azure中提取数据层应用DB的工作是由T-SQL中的这一行发起的:

EXEC MASTER..xp_cmdshell '%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe -File C:\Git\GetUpdatedAzureDB\GetAzureDB.ps1"'

Powershell 脚本执行以下操作:

  1. 提取的目标是一个名为 today.bacpac 的文件(硬编码)。要做的第一件事是删除该文件(如果它已经存在)。
  2. 将数据库从 Azure 提取到 today.bacpac 文件中。

注意:我在 Azure 上的数据库有一个用于加密的主密钥。在将 bacpac 文件导入本地数据库之前,需要将其从文件中删除,否则它将失败(根据我之前与 MS 支持人员的对话,在 SQL 2017 年可能不需要这样做)。如果您不使用万能钥匙,您可以删除执行此步骤的代码,也可以不理会它。如果它不存在,它不会删除任何东西。它只会给程序增加一点开销。

  1. 打开 today.bacpac 文件(zip 文件)并从 Origin.xml 文件中删除 MasterKey 节点。
  2. 修改 Model.xml 文件以更新 SHA 哈希长度。这是必需的,以便在 SQL 打开 bacpac 文件时文件不会被篡改。
  3. 今天将文件重新压缩成一个新文件-patched.bacpac
  4. 运行这行代码(来自 Powershell)将 bacpac 文件导入 SQL 服务器

    &C:\Program Files (x86)\Microsoft SQL Server0\DAC\bin\SqlPackage.exe" /Action:Import /SourceFile:"C:\Git\GetUpdatedAzureDB\today-patched.bacpac" /TargetConnectionString:"Data Source=MyLocalSQLServer;User ID=sa; Password=MySAPassword; Initial Catalog=MyLocalDB; Integrated Security=false;"
    

编辑这两个文件以提供更新的路径、用户名和密码后,运行 SQL 脚本。您不需要再次编辑脚本。您可以再次 运行 SQL 脚本,无需修改,它将创建您的 Azure 数据库的新副本。

完成!