Azure SQL DatabaseのbacpacでSQL Serverインポートエラー(CREATE MASTER KEY失敗 : SQL72045)

Azure SQL Databaseからエクスポートして生成したbacpacファイルを、ローカルのSQL Server(2012,2014,2016など)にSSMSでインポートする場合、以下のエラーがでることがあります。

パッケージをインポートできませんでした。

Error SQL72045: スクリプトの実行エラーです。実行されたスクリプト:

CREATE MASTER KEY;

内容

Azure SQL Database側で、マスターキーが設定されています。

回避策は以下のMSDNブログに書いている通りです。

Exported database from Azure SQL failed to be imported to Azure SQL or to local SQL Server – Azure SQL Database Support

原因

AuditやTDE(透過的暗号化)を使うときマスターキーが使用されます。Azure SQL Databaseではパスワードがないマスターキーの作成が可能ですが、ローカルのSQL Serverではマスターキーのパスワード設定が必要です。

回避策

選択肢1 (設定変更)

  • Azureでエクスポートする前に、エクスポート元の既存DBのマスターキーを変更する。

選択肢2(PowerShellパッチ)

  • PowerShellファイルをダウンロードして「RemoveMasterKey.ps1 -bacpacPath “C:¥BacPacs¥Test.bacpac"」というコマンドを実行→拡張子にpatchが付与されたファイルが追加されます。このファイルを使ってインポートする。
  • PowerShellの中では、以下の処理を実施している
    • スキーマやセキュリティ情報を含むmodel.xmlからマスターキーオブジェクト(<Element Type=“SqlMasterKey” />)と資格証明オブジェクト(SqlDatabaseCredential)を削除
    • model.xmlを変更していないかを示すチェックサムがあるので、計算して、Origin.xmlに記載

選択肢3(手動パッチ)

  • 選択肢2がうまくいかない場合のため、手動によるBacpacの編集を解説しています。
    • 手動でZIP(bacpac)を解凍し、model.xmlとOrigin.xmlを編集し、再度ZIP圧縮します。
    • 詳細の説明はこちら→ Editing a .bacpac file – Azure SQL Database Support 。ここにはOrigin.xmlに保存するハッシュを計算するps1もあり。
    • トラブルシューティングのための説明となります。DBファイルサイズが大きい場合などに発生しうるのかもしれません。
    • なお、model.xmlなどのファイル名の大文字小文字は重要です。
    • 設定そのものとDataフォルダの中身(BCP用データ)に関係はないため、Dataフォルダを軽いものだけにしてテストをすると良いと思います。Windows標準のZIPではだめでしたが、別のZIP圧縮ツールではうまく行ったということもありました。

選択肢2が楽で良いのですが、まれに選択肢3を使わなければ行けない場合がありました。

参考