Sync Framework 2.1 を使用してSQL ServerとSQL Azureを同期させてみた
SQL Server to SQL Azure Synchronization using Sync Framework 2.1 | LiamCavanagh | Channel 9のビデオを見て簡単に内容を書き起こしてみました。
Download details: Microsoft Sync Framework 2.1 Software Development Kit (SDK)から、SDKをダウンロードします。64ビット版と84ビット版の両方が公開されているので、自分のインストールしているVisual Studioに一致するSDKをダウンロードします。
ローカルのSQL Serverに「AdventureWorksLT」データベースを用意します。Codeplexからダウンロードし、インストールします。SQL Server Management Studio 2008 R2でデータベースに接続します。
AdventureWorksLTには、CustomerテーブルやProductテーブルがあります。今回、SQL Azureと動機をとるテーブルです。
次に、SQL Server Management Studio 2008 R2でSQL AzureのマスターDBに接続し、SQL Azureに新規データベースを追加します。SQL Azureのデータベースを接続し右クリックし、コンテキストメニューから「新しいデータベース」を選択する。
クエリエディタが開くので、データベース名「AdventureWorksLTSQLAzure」と入力し、F5キーを押しクエリを実行する。
SQL Azureに「AdventureWorksLTSQLAzure」データベースが作成できました。データベースだけですので、テーブルは一つもありません。
ビデオとこの投稿で、いくつかの条件に差異があります。まず、動画ではAdventureWorksLT2008を使用していますが、2008R2を追加した関係で、AdventureWorksLT2008R2になっています。スキーマが全て動画内ではdboになっていますが、通常はSalesLTとなっています。提示されたサンプルコードでは、スキーマで例外が発生します。回避策としては、SQL Azureに手動で、「CREATE SCHEMA [SalesLT] AUTHORIZATION [dbo]」クエリを発行しスキーマを作成する方法があります。コードで回避する方法は調べた範囲ではわからず。
Visual Studio 2010を立ち上げ、「ファイル」→「新しいプロジェクト」を選択します。テンプレートから「コンソールアプリケーション」を選択し、名前に「SyncTest」と入力し、「OK」ボタンを選択します。C#を選択すると、コードコピペで対応できていいですよ♪
ソリューションエクスプローラーから、参照の追加を選択します。
参照タブを選択し、C:\Program Files (x86)\Microsoft Sync Framework\2.1\Runtime\x86のMicrosoft.Synchronization.dllを選択し、「OK」ボタンを押します。
同様の手順で、参照の追加画面を開き、C:\Program Files (x86)\Microsoft Sync Framework\2.1\Runtime\ADO.NET\V3.1\x86のMicrosoft.Synchronization.Data.dllとMicrosoft.Synchronization.Data.Server.dllとMicrosoft.Synchronization.Data.SqlServer.dllを選択します。Microsoft.Synchronization.Data.SqlServerCe.dllは、SQL Server Compactと同期を取るときに必要になります。今回は必要ないので選択しません。
Sync Framework Team Blogからコードをコピーし、コードエディターのコードをすべて削除し、コピーしたコードを貼り付けます。
下の選択している2行のコードがSQL Azureの接続文字列とSQL Serverの接続文字列です。それぞれ自分の環境に合わせて修正します。下の画像の最後の行がスコープです。同期をとるデータベースやテーブルなどをひとくくりで管理する単位の名称です。
次のコードは、コンソールアプリケーション起動引数で動作を切り替えます。-setupでsetupメソッドを呼び出し、-syncでsyncメソッドを呼び出します。
setupメソッドの冒頭では、SQL ServerとSQL Azureそれぞれのsqlconnectionを作成しています。次の行では、同期スコープを作成しています。
同期をとるテーブルCustomerとProductを指定し、テーブルスキーマを取得します。
スコープにテーブルを追加します。
下の画像の一行目で、同期プロバイダーを作成する。下から2行目でapplyで同期を実行する。
syncメソッドです。Directionで同期種類を指定できます。Directionには、Download、DownloadAndUpload、Upload、UploadAndDownloadの4種類から選ぶことができます。
ビルドします。
コマンドプロンプトでディレクトリに移動し、SyncTestを実行します。
引数を指定するように、表示されますので、引数「-setup」を指定して再実行します。実行すると下のような表示が行われ処理が完了します。
プロビジョニング(setupメソッド)をすると、ローカルのSQL Serverに幾つかのテーブルが追加されます。下の図の赤で囲んだテーブルが追加されます。共通テーブルが3つと、同期をとるテーブルごとに1つテーブルが追加されます。(CustomerとProductテーブルを対象にしたので、それぞれのテーブル名+「_tracking」が追加されます。)
空っぽだったSQL Azureのデータベースにテーブルが追加されます。
データの同期を行うために引数「-sync」を指定して再実行します。実行すると下のような表示が行われ処理が完了します。
SQL Azureデータベースに対して、select * From SalesLT.customerを発行し結果を確認します。
同期テストを行うために、SQL Azure上のデータを更新します。クエリエディタでupdate SalesLT.customer set FirstName=’SyncTest’ where customerid=1を実行しデータを更新します。
データの同期を行うために引数「-sync」を指定して再実行します。実行すると下のような表示が行われ処理が完了します。
1件更新が行われています。SQL AzureからSQL Serverにデータの反映されています。