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をダウンロードします。

20100904234949

ローカルのSQL Serverに「AdventureWorksLT」データベースを用意します。Codeplexからダウンロードし、インストールします。SQL Server Management Studio 2008 R2でデータベースに接続します。

 

20100905010400

AdventureWorksLTには、CustomerテーブルやProductテーブルがあります。今回、SQL Azureと動機をとるテーブルです。

次に、SQL Server Management Studio 2008 R2でSQL AzureのマスターDBに接続し、SQL Azureに新規データベースを追加します。SQL Azureのデータベースを接続し右クリックし、コンテキストメニューから「新しいデータベース」を選択する。

000000

クエリエディタが開くので、データベース名「AdventureWorksLTSQLAzure」と入力し、F5キーを押しクエリを実行する。

20100905011638

SQL Azureに「AdventureWorksLTSQLAzure」データベースが作成できました。データベースだけですので、テーブルは一つもありません。

ビデオとこの投稿で、いくつかの条件に差異があります。まず、動画ではAdventureWorksLT2008を使用していますが、2008R2を追加した関係で、AdventureWorksLT2008R2になっています。スキーマが全て動画内ではdboになっていますが、通常はSalesLTとなっています。提示されたサンプルコードでは、スキーマで例外が発生します。回避策としては、SQL Azureに手動で、「CREATE SCHEMA [SalesLT] AUTHORIZATION [dbo]」クエリを発行しスキーマを作成する方法があります。コードで回避する方法は調べた範囲ではわからず。

20100905012320

Visual Studio 2010を立ち上げ、「ファイル」→「新しいプロジェクト」を選択します。テンプレートから「コンソールアプリケーション」を選択し、名前に「SyncTest」と入力し、「OK」ボタンを選択します。C#を選択すると、コードコピペで対応できていいですよ♪

000001

ソリューションエクスプローラーから、参照の追加を選択します。

000002

参照タブを選択し、C:\Program Files (x86)\Microsoft Sync Framework\2.1\Runtime\x86のMicrosoft.Synchronization.dllを選択し、「OK」ボタンを押します。

000003

同様の手順で、参照の追加画面を開き、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と同期を取るときに必要になります。今回は必要ないので選択しません。

000004

Sync Framework Team Blogからコードをコピーし、コードエディターのコードをすべて削除し、コピーしたコードを貼り付けます。

下の選択している2行のコードがSQL Azureの接続文字列とSQL Serverの接続文字列です。それぞれ自分の環境に合わせて修正します。下の画像の最後の行がスコープです。同期をとるデータベースやテーブルなどをひとくくりで管理する単位の名称です。

20100905014105

次のコードは、コンソールアプリケーション起動引数で動作を切り替えます。-setupでsetupメソッドを呼び出し、-syncでsyncメソッドを呼び出します。

20100905014511

setupメソッドの冒頭では、SQL ServerとSQL Azureそれぞれのsqlconnectionを作成しています。次の行では、同期スコープを作成しています。

20100905014823

同期をとるテーブルCustomerとProductを指定し、テーブルスキーマを取得します。

20100905015012

スコープにテーブルを追加します。

20100905015239

下の画像の一行目で、同期プロバイダーを作成する。下から2行目でapplyで同期を実行する。

20100905015503

syncメソッドです。Directionで同期種類を指定できます。Directionには、Download、DownloadAndUpload、Upload、UploadAndDownloadの4種類から選ぶことができます。

20100905015900

ビルドします。

コマンドプロンプトでディレクトリに移動し、SyncTestを実行します。

20100905020503

引数を指定するように、表示されますので、引数「-setup」を指定して再実行します。実行すると下のような表示が行われ処理が完了します。

20100905062509

プロビジョニング(setupメソッド)をすると、ローカルのSQL Serverに幾つかのテーブルが追加されます。下の図の赤で囲んだテーブルが追加されます。共通テーブルが3つと、同期をとるテーブルごとに1つテーブルが追加されます。(CustomerとProductテーブルを対象にしたので、それぞれのテーブル名+「_tracking」が追加されます。)

20100905063125

空っぽだったSQL Azureのデータベースにテーブルが追加されます。

20100905063320

データの同期を行うために引数「-sync」を指定して再実行します。実行すると下のような表示が行われ処理が完了します。

20100905063643

SQL Azureデータベースに対して、select * From SalesLT.customerを発行し結果を確認します。

20100905063841

同期テストを行うために、SQL Azure上のデータを更新します。クエリエディタでupdate SalesLT.customer set FirstName=’SyncTest’ where customerid=1を実行しデータを更新します。

20100905064251

データの同期を行うために引数「-sync」を指定して再実行します。実行すると下のような表示が行われ処理が完了します。

20100905064408

1件更新が行われています。SQL AzureからSQL Serverにデータの反映されています。

20100905064553