Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SQL Anywhere 11.0.1 (日本語) » Mobile Link - クイック・スタート » Mobile Link テクノロジの概要 » Mobile Link Contact サンプルの解説 » Contact サンプルの同期

 

Contact サンプルの製品の同期

Product テーブル用のスクリプトは、競合の検出と解決の例を示しています。

Product テーブルは他のテーブルとは別のパブリケーションに保管されているため、別個にダウンロードできます。たとえば、価格変更と営業担当者が低速リンク経由で同期している場合は、それぞれ顧客と窓口の変更をアップロードしなくても、製品変更をダウンロードできます。

ビジネス・ルール

リモート・データベース側で可能な変更は、注文を受けた時点で quantity カラムの値を変更することだけです。

ダウンロード
  • download_cursor   次の download_cursor スクリプトは、最後のリモート・データベースの同期以後に変更されたすべてのローをダウンロードします。
    SELECT id, name, size, quantity, unit_price
    FROM product
    WHERE last_modified >= ?
    AND active = 1

  • download_delete_cursor   次の download_delete_cursor スクリプトは、会社が販売を中止した製品をすべて削除します。これらの製品には、統合データベース内で非アクティブのマークが付きます。
    SELECT id, name, size, quantity, unit_price
    FROM product
    WHERE last_modified >= ?
    AND active = 0

アップロード

リモート・データベースからは UPDATE 操作のみがアップロードされます。これらのアップロード・スクリプトの主な機能は、競合の検出と解決のためのプロシージャです。

2 人の営業担当者が注文を受けて同期を行うと、それぞれの注文数が Product テーブルの quantity カラムから減算されます。たとえば、Samuel Singer が野球帽 (製品 ID 400) 20 個の注文を受けると、数量は 90 から 70 に変化します。Pamela Savarino が Samuel Singer の変更を受け取る前に野球帽 10 個の注文を受けると、自分のデータベース内のカラムの値が 90 から 80 に変化します。

Samuel Singer が自分の変更を同期すると、統合データベース内の quantity カラムは 90 から 70 に変更されます。Pamela Savarino が自分の変更を同期した場合の正しい値は 60 です。この設定は、競合を検出することで行われます。

競合検出スキーマには、次のスクリプトが含まれています。

  • upload_update   次の upload_update スクリプトは、統合データベース側で単純な UPDATE を実行します。
    UPDATE product
    SET name = ?, size = ?, quantity = ?, unit_price = ?
    WHERE product.id = ?

  • upload_fetch   次の upload_fetch スクリプトは、Product テーブルから単一のローをフェッチして、アップロードされるローの古い値と比較します。2 つのローが異なる場合は、競合が検出されます。
    SELECT id, name, size, quantity, unit_price
    FROM Product
    WHERE id = ?

  • upload_old_row_insert   競合が検出されると、古い値が product_conflict テーブルに挿入されます。これは resolve_conflict スクリプトによって使用されます。row_type カラムに、Old を表す値 O を持つローが追加されます。
    INSERT INTO DBA.product_conflict(
     id, name, size, quantity, unit_price, row_type )
    VALUES( ?, ?, ?, ?, ?, 'O' )' )

  • upload_new_row_insert   次のスクリプトは、アップロードされるローの新しい値を product_conflict テーブルに追加します。これは、resolve_conflict スクリプトによって使用されます。
    INSERT INTO DBA.product_conflict(
     id, name, size, quantity, unit_price, row_type )
    VALUES( ?, ?, ?, ?, ?, 'N' )

競合解決
  • resolve_conflict   次のスクリプトは、統合データベース内の数量値に新しい値と古い値の差を加算して、競合を解決します。
    UPDATE Product
    SET p.quantity = p.quantity
                  - old_row.quantity
                  + new_row.quantity
    FROM Product p,
         DBA.product_conflict old_row,
         DBA.product_conflict new_row
    WHERE p.id = old_row.id
        AND p.id = new_row.id
        AND old_row.row_type = 'O'
        AND new_row.row_type = 'N'