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

Joe*_*ker 4 database powershell extract azure

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

您会发现其他人在这里遇到此问题:SSMS 2016 Error Importing Azure SQL v12 bacpac: master key without password not support

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

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

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

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

Joe*_*ker 5

我是这个论坛的新手。请不要对这篇文章严厉。我正在尽我所能帮助其他人节省我花在这个问题上的时间。

我拼凑了一个 T-SQL 脚本,该脚本调用 Windows Powershell 脚本(也从多个源拼凑而成),以从 Microsoft Azure SQL 数据库中提取数据层应用程序(数据库),并通过运行将其导入本地 SQL Server 上的数据库中一个命令。几个月来,我从其他博客等中发现了我的脚本中的一些代码。由于这些人,我无法提供信用,因为我没有跟踪我从哪里获得信息。如果您正在阅读本文并看到您的代码,请相信。我很抱歉无法对您的工作给予认可。

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

我使用的是 Windows 10 专业版和 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"'
Run Code Online (Sandbox Code Playgroud)

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. 将文件重新压缩回新文件 Today-patched.bacpac
  4. 运行此行代码(从 Powershell)以将 bacpac 文件导入 SQL Server

    &C:\Program Files (x86)\Microsoft SQL Server\140\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;"
    
    Run Code Online (Sandbox Code Playgroud)

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

完毕!