Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.
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'