SQL Database と SQL Server 間でデータベースを相互に移行する場合、bacpac を使用することがあるかと思います。
bacpac ですが、同一の環境 (SQL Database 間 / SQL Server 間) での移行は、特に問題はないのですが、異なる環境間で移行をする場合、SQL Database で外部テーブルを使用していると、移行できないケースがありますので紹介を。
SQL Database で外部テーブルを使用している DB で bacpac を取得し、それを SQL Server にインポートしようとすると以下のようなエラーが発生します。
bacpac には、外部テーブルを作成するために必要となる、EXTERNAL DATASOURCE の構文が含まれており、SQL Server では、現状、RDBMS を使用した外部データソースには対応していませんので、エラーとなり、bacpac をインポートすることができません。
GUI で bacpac を作成する場合、テーブルの取捨選択ができますが、外部テーブルを除いたとしても外部データソースの構文は含まれており、通常の方法では、この構文を除外することができないかと思います。
bacpac は ZIP 圧縮されたファイルですので、スキーマが記載されている「model.xml」から不要となる個所を削除し、修正後の modexl.xml に対して、「Get-FileHash
'.\model.xml'
-Algorithm
SHA256
」で取得したファイルハッシュを、「Origin.xml」のチェックサムとして設定し、再度 ZIP 圧縮することで、対応を行うということもできます。
# ZIP 圧縮する際には、各ファイルが圧縮ファイルの直下に含まれる形で作成する必要があります。
bacpac のサイズが小さければこの方法でも問題ないかと思いますが、サイズが大きいデータベースに対してデータを持ってきたい場合には、bacpac ではなく、SQL Database Migration Wizard を使用するとよいかと思います。
現状は、SQL Server 2014 までの対応ですが、SQL Database v12 で作成されているデータベースを SQL Server 2016 に移行したい場合などに利用することができます。
外部テーブルに関しては、ローカルテーブルとして移行されてしまいますが、データを持ってきたいという場合には、シンプルな方法で実施することが可能です。
SQLAzureMW では、コマンドラインベースで実施することができる SQLAzureMWBatchBackup (データエクスポート用) / SQLAzureMWBatchUpload (データインポート用) というツールが提供されていますので、これらを使って以下のようなコマンドを実行することでデータを移行することができます。
SQLAzureMWBatchBackup.exe -S hogehoge.database.windows.net -U hogehoge -P hogehoge -D TESTDB -O c:\temp\TESTDB -a false SQLAzureMWBatchUpload.exe -S localhost -T -D TESTDB -i c:\temp\DB1\TESTDB.sql -d false
SQL Database の外部テーブルは、手軽に他の DB のテーブルを参照することができるため、便利なのですが、開発用途でローカルの SQL Server に持ってきたい場合などは、この辺を覚えておくとよいかと。
# 外部テーブルは便利ではあるのですが、パフォーマンスが出ない時のクエリチューニングの対応をそれなりに考えておく必要があったりしますが。