このトピックでは、クライアントおよびサーバー アプリケーションの配置とバージョン管理について説明します。ピア データベースの初期化の詳細については、「コラボレーション同期を構成して実行する方法 (SQL Server 以外)」の「サーバー データベースの初期化」を参照してください。
Sync Framework を使用するクライアントおよびサーバー アプリケーションの配置方法は、2 層アプリケーションと N 層アプリケーションのどちらであるかによって異なります。2 層アプリケーションでは、すべての同期コードがクライアント上にあるので、アプリケーションを SQL Server Compact に基づく他のアプリケーションと同様に配置できます。通常、配置では、ClickOnce を使用してアプリケーションをパブリッシュするか、アプリケーションをパッケージ化してから各クライアントにコピーします。SQL Server Compact を使用するアプリケーションの配置方法の詳細については、SQL Server Compact オンライン ブックの「アプリケーションの配置」および「アプリケーションをビルドしてデスクトップに配置する方法」を参照してください。N 層アプリケーションでは、サーバー側の同期コンポーネントをホストするコンピューターにもコードを配置する必要があります。
クライアント データベースの作成と初期化
2 層および N 層のアプリケーションでは、アプリケーションに必要なスキーマとデータを含むクライアント データベースを作成および初期化する方法を決定する必要があります。主に、次の 2 つの方法があります。
Sync Framework を使用してデータベースを作成し、最初の同期中にテーブルのスキーマとデータをダウンロードします。これは最も簡単な方法です。ただし、クライアント数が多く、データセットが大量の場合は、多くのネットワーク トラフィックとサーバー処理が必要になることがあります。
テーブル スキーマと初期データセットを含むデータベースを事前に作成します。.sdf ファイル形式のデータベースは、クライアント アプリケーションによってトランスポートまたはダウンロードできます。アプリケーションによって増分変更がダウンロードされると、最初の同期中に、クライアント データベースは最新状態になります。この方法を使用する場合は、CreationOption プロパティに適切な値を設定してください。
アプリケーションにアップロードが含まれている場合に、変更が行われた場所を確認するには、アプリケーションで ClientId プロパティを設定して、サーバーに対してクライアント データベースを一意に識別します。このプロパティを設定しなければ、Sync Framework によって、データベースに新しい ID が生成されます。
注意
クライアント データベースの事前作成は、クライアントごとに別々にデータがフィルター選択されるアプリケーションには適していません。このような場合、最初の同期中に変更が失われる可能性があります。
>
クライアント データベースを初期化する方法の詳細については、「クライアント データベースを初期化してテーブル スキーマを操作する方法」を参照してください。
アプリケーションのバージョン管理
アプリケーションが開発および配置された後に、そのアプリケーションの新しいバージョンが開発される場合があります。アプリケーションのバージョン管理では、次の 2 点を考慮する必要があります。
新しいバージョンの影響を受けるアプリケーションの部分はどこか
新しいバージョンを以前のバージョンと共存させる必要があるかどうか
通常、サーバー側コンポーネントはクライアント側コンポーネントとは別に更新できるため、Sync Framework の N 層アプリケーションは簡単に更新できます。これにより、更新された機能を備えた新しいサービスの公開が可能になり、クライアントでクライアント側コンポーネントを更新できるようになるまで、クライアントがサーバー側の変更から保護されます。
N 層アプリケーションのバージョン管理
Sync Framework で考慮する必要がある主なアプリケーションの更新は、サーバー データベースに対するスキーマの変更です。Sync Framework では、スキーマの変更が自動的にサーバーからクライアントに反映されることはありません。ただし、アプリケーションの該当する部分を更新すれば、スキーマの変更はサポートされます。クライアント データベースでサポートされるスキーマの変更の一覧については、「テーブル スキーマの操作」を参照してください。スキーマの変更がサーバー データベースで行われたら、まず、その変更をクライアントに反映すべきかどうかを判断する必要があります。たとえば、サーバー データベース内のテーブルにクレジット カード列を追加しても、従業員がオフラインでクレジット カード情報を取得することを禁止するビジネス ルールがある場合、スキーマの変更をクライアントに反映する必要はありません。スキーマの変更を反映する場合、その方法は変更の種類によって異なります。
一般的なスキーマの変更
最も一般的なスキーマの変更には、既存のテーブルへの列の追加と新しいテーブルの追加、または本来アプリケーションに含まれていなかった既存のテーブルの追加の決定という 2 つがあります。アプリケーションで新しいテーブルを同期する必要がある場合、テーブルに SyncAdapter を追加する必要があります。サーバー コンポーネントが更新されると、クライアント アプリケーションまたはアプリケーションのユーザーは、新しいテーブルを同期するかどうかを決定できます。新しいテーブルの同期を決定した場合、クライアント コンポーネントを変更して、新しいテーブルに SyncTable を含める必要があります。このような変更は、なんらかの方法で各クライアント アプリケーションに適用する必要があります。ClickOnce テクノロジを使用すると、アプリケーションの更新をパブリッシュできるので、アプリケーションは、起動する前に更新の有無を確認できます。テーブルに新しい列を追加してその列を同期する場合、クライアント データベースに列を追加し、変更の同期に使用するコマンドを更新する必要があります。新しい列の追加以外のスキーマの変更では、クライアントのテーブルを削除し、Sync Framework やその他のメカニズムを使用してテーブルを再作成します。
複数のバージョンの共存
場合によっては、クライアント アプリケーションの新しいバージョンと古いバージョンを共存させることが必要になる場合があります。このような場合、次の 2 つの方法を使用できます。
古いバージョンのクライアント コンポーネントが引き続き適切なバージョンのサーバー コンポーネントにアクセスできるように、複数のバージョンのサーバー コンポーネントを維持します。バージョン管理のための最善の方法は、更新された機能を備えた新しいサービスを公開することです。クライアントは、ClickOnce テクノロジを使用してアップグレードできます。アップグレードが完了したら、クライアントは新しい Web サービスにリダイレクトされます。
アプリケーションのバージョン パラメーターを使用するように、クライアント コンポーネントとサーバー コンポーネントをデザインします。この方法を使用すると、クライアント アプリケーションは、必要なバージョンをサーバーに通知できます。サーバーから挿入を選択するストアド プロシージャで
@appversionパラメーターを受け取る次の例について考えてみます。パラメーターは SelectIncrementalInsertsCommand に追加され、値は SyncAgent の SyncParameter を使用して指定されます。同期が発生すると、アプリケーションのバージョンがサーバーに送信され、ストアド プロシージャによって、適切なバージョンのテーブル スキーマが選択されます。this.Configuration.SyncParameters.Add( new SyncParameter("@appversion", 1)); customerIncrUpdates.Parameters.Add("@appversion", SqlDbType.Int); Me.Configuration.SyncParameters.Add( _ New SyncParameter("@appversion", 1)) customerIncrUpdates.Parameters.Add("@appversion", SqlDbType.Int); CREATE PROCEDURE usp_CustomerSelectIncrementalInserts( @sync_last_received_anchor timestamp, @sync_new_received_anchor timestamp, @appversion int ) AS IF @appversion = 1 BEGIN SELECT CustomerId, CustomerName, SalesPerson FROM Sales.Customer WHERE InsertTimestamp > @sync_last_received_anchor AND InsertTimestamp <= @sync_new_received_anchor END ELSE IF @appversion = 2 BEGIN SELECT CustomerId, CustomerName, SalesPerson, CustomerType FROM Sales.Customer WHERE InsertTimestamp > @sync_last_received_anchor AND InsertTimestamp <= @sync_new_received_anchor END ELSE BEGIN PRINT('Unrecognized version') RETURN END