SSMS 2016错误导入Azure SQL v12 bacpac:不支持密码的主密钥

How*_*sca 29 sql-server ssms azure azure-sql-database ssms-2016

我做了几十次,但最近刚遇到这个错误.以下是我到达此处的步骤:

  1. 在与原始服务器相同的服务器上创建Azure SQL v12数据库的副本
  2. 将副本版本(从用户交互完全不活动)导出到blob存储
  3. 将.bacpac文件从blob存储下载到本地驱动器
  4. 在SSMS(2016年10月发布)我的本地sql server实例中,右键单击Databases并选择'Import Data Tier Application'
  5. 选择我最近下载的bacpac文件并开始导入

炸弹只需要几秒钟,我就会收到错误:

Error SQL72014: .Net SqlClient Data Provider: Msg 33161, Level 15, State 1, Line 1 Database master keys without password are not supported in this version of SQL Server
Error SQL72045: Script execution error. The executed script: CREATE MASTER KEY;
Run Code Online (Sandbox Code Playgroud)

我对同一个数据库进行了相同的处理1.5个月前,任何一切都运行正常......还有其他人遇到过这个吗?我安装了SSDT版本14.0.61021.0 - 不确定是否重要.我也在运行SQL Server 2016 Developer Edition(v13.0.1722.0).

Mar*_*nce 37

我有同样的问题.在与Azure支持人员交谈后,他们发现问题是由于创建了一个空白数据库主密钥来加密审计的存储凭据(审计是可选设置).

请注意,数据库审核设置是从服务器设置继承的.

无论如何,他们想出的工作是:

  1. 禁用服务器(或数据库)上的审核
  2. 使用DROP MASTER KEY命令删除数据库主密钥.

然后导出按预期工作.希望Azure能尽快解决这个问题,以便审计和导出可以协同工作.

更新2017年3月21日更好的解决方案来自MS

由于修复程序需要一段时间才能部署,因此他们还建议了一种替代解决方案,它不需要任何其他步骤(例如禁用审核或博客中的步骤)来避免此问题.启用审核后,请更新主密钥并设置密码.为现有主密钥设置密码可以缓解此问题.此外,设置密码不会影响审核,它将继续工作.添加密码的语法如下:

-- execute in the user database
ALTER MASTER KEY ADD ENCRYPTION BY PASSWORD = ‘##############’;
Run Code Online (Sandbox Code Playgroud)

该链接还有一个PowerShell脚本,您可以使用该脚本从.bacpac文件中删除有问题的SQL语句.

  • 来自MS的博客文章详情https://blogs.msdn.microsoft.com/azuresqlemea/2017/03/30/exported-database-from-azure-sql-failed-to-be-imported-to-azure-sql-或到本地SQL服务器/ (5认同)

How*_*sca 16

好吧,我最终解决此问题的方法是执行以下操作:

  1. 在与原始服务器相同的服务器上创建SQL Azure数据库的副本
  2. 在该数据库中运行以下脚本:

    ALTER MASTER KEY REGENERATE WITH ENCRYPTION BY PASSWORD = [password here];
    
    Run Code Online (Sandbox Code Playgroud)
  3. 按照原始帖子中的步骤2-5进行操作

我没有看到关于此的文档,但显然当您创建Azure SQL数据库时,它会创建一个没有密码的数据库主密钥(DMK),而在SQL Server 2016中,这是不可行的.希望这有助于其他人.

注意:我能够这样做,因为我只希望原始数据库中的数据刷新我的本地开发副本 - 我还没有完全研究它的含义.


Adr*_*Onu 11

你需要:

  • 从bacpac中删除主密钥对象
  • 从bacpac中删除凭证对象

这个脚本在微软发布的博客,运行它,并会尽一切之上.

C:\PS> .\RemoveMasterKey.ps1  -bacpacPath "C:\BacPacs\Test.bacpac
Run Code Online (Sandbox Code Playgroud)

  • 当我尝试它时,这对我不起作用,它最终创建了一个无用的损坏的.bacpac.我不知道为什么,因为我听说它适用于其他人. (2认同)