Windows Azure Import/Export サービスの改善によるExportに失敗する可能性が増加した理由

SQL Server 2012 データ層アプリケーションフレームワーク(DACFx V3)で提供されているWindows Azure Import/ExportサービスはWindows Azure SQL Databasesの移行や論理バックアップ・リストアをするためのクラウドサービスです。この機能は、Windows Azure 管理ポータルとHTTPエンドポイント経由で使用できます。

最近、このサービスのアップデートで、Export処理時のバリデーションチェックを強化しました。
エクスポートしたBACPACsをAzure上の新しいデータベースにインポート(リストア)できることを保証するためにバリデーションを改善しました。しかし、このバリデーションの改善の影響で、エクスポートの失敗を見る機会が増えるかもしれません。オブジェクトの定義に、3つの識別子の定義名(DBName.dbo.myTableみたいなの)を使用していると失敗します。

シナリオ

HTTPエンドポイントやWindows Azure管理ポータルからImport/Exportサービスを使用してWindows Azure SQL Databasesをエクスポートすると失敗する。

現象

エクスポート処理に失敗し次のようなエラーメッセージが表示される。

“Exception Microsoft.SqlServer.Management.Dac.Services.ServiceException: Error encountered during the service operation. Inner exception Microsoft.SqlServer.Dac.DacServicesException: Validation of the schema model for data package failed. Error SQL71562: Procedure: [dbo].[SampleProcedure] has an unresolved reference to object [MyDB].[dbo].[TestTable]. External references are not supported when creating a package from this platform.”

原因

オブジェクト定義で、3つの識別子の参照名を含んでいると、データベースのエクスポートがバリデーションチェックではじかれて失敗します。

理由

DACFxは、オブジェクト定義(ビューやプロシージャなど)に外部参照を含んているとエクスポート処理を停止します。Azure SQL Databasesはデータベースを跨る外部参照を許可していません。3つの識別子名を含んでいるとデータベースエクスポートを停止します。
もし3つの識別子名を含んだままエクスポートに成功してしまうと、エクスポートしたBACPACをインポートする際に必ずインポートに失敗してしまいます。

3部構成名

SQL Serverではオブジェクトを参照する際に、次のような定義をすることができます。

データベース名.スキーマ.オブジェクト名
(例) AdventureWorks.dbo.userinfo

データベース名とスキーマとオブジェクト名を指定して、オブジェクトを参照します。
この場合、データベース名は同じデータベースでも、外部のデータベースでも指定できます。
しかし、Azure SQL Databasesでは、データベースをまたがった参照はできないので、次のような定義をする必要があります。2つの識別子名

スキーマ.オブジェクト名

詳細は、「オブジェクト名としての識別子の使用」を参照してください

解決方法

データベーススキーマーを変更し、すべての3部構成名を削除し、2つの識別子名に変更します。

外部参照を削除してスキーマーを修正するための多くのツールや手段があります。
たとえば、SQL Server Data Tools(SSDT)を使用することも可能です。SSDTでは、Azure Databaseからデータベースプロジェクトを作成すると、対象プロジェクトにSQL Azureを設定します。Azure用のスキーマバリデーションチェックをし、外部参照に3部構成名を使用しているとエラーとしてエラー一覧に表示されます。

情報源

Windows Azure Import/Export Service and External References