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 サーバ・テクノロジの使用 » 同期の方法 » 競合の解決 » 競合の解決


resolve_conflict スクリプトによる競合の解決

Mobile Link サーバが upload_fetch スクリプトを使用して競合を検出すると、次のイベントが発生します。

  • Mobile Link サーバは、リモート・データベースからアップロードされた古いロー値を upload_old_row_insert スクリプトの定義に従って挿入します。通常、古い値はテンポラリ・テーブルに挿入されます。

    upload_old_row_insert テーブル・イベントを参照してください。

  • Mobile Link サーバは、リモート・データベースからアップロードされた新しいロー値を upload_new_row_insert スクリプトの定義に従って挿入します。通常、新しい値はテンポラリ・テーブルに挿入されます。

    upload_new_row_insert テーブル・イベントを参照してください。

  • Mobile Link サーバは、resolve_conflict スクリプトを実行します。このスクリプトでは、ストアド・プロシージャを呼び出したり、実行手順の順序を定義したりすることによって、新しいロー値と古いロー値を使用して競合を解決できます。

詳細については、resolve_conflict テーブル・イベントを参照してください。

次の例では、6 つのイベントに対してスクリプトを作成し、次にストアド・プロシージャを作成します。

  • begin_synchronization スクリプトでは、contact_new と contact_old という 2 つのテンポラリ・テーブルを作成します。(begin_connection スクリプトでこれを行うこともできます)。

  • upload_fetch スクリプトは、競合を検出します。

  • 競合がある場合、upload_old_row_insert スクリプトと upload_new_row_insert スクリプトは、リモート・データベースからアップロードした新しいデータと古いデータを使用して、2 つのテンポラリ・テーブルを設定します。

  • resolve_conflict スクリプトは、MLResolveContactConflict ストアド・プロシージャを呼び出して、競合を解決します。

イベント スクリプト
CREATE TABLE #contact_new( 
   id  INTEGER,
   location CHAR(36),
   contact_date DATE);
CREATE TABLE #contact_old(
   id  INTEGER,
   location CHAR(36),
   contact_date DATE)
SELECT id, location, contact_date
   FROM contact
   WHERE id = {ml}
INSERT INTO #contact_new( id, location, contact_date ) 
  VALUES ( {ml}, {ml r.location}, {ml r.contact_date} )
INSERT INTO #contact_old( id, location, contact_date )
  VALUES ( {ml}, {ml r.location}, {ml r.contact_date} )
CALL MLResolveContactConflict( )
DROP TABLE #contact_new;
DROP TABLE #contact_old

MLResolveContactConflict ストアド・プロシージャは次のとおりです。

CREATE PROCEDURE MLResolveContactConflict( )
  --update the consolidated database only if the new contact date
  --is later than the existing contact date
  UPDATE contact c
    SET c.contact_date = cn.contact_date
      FROM #contact_new cn
      WHERE =
        AND cn.contact_date > c.contact_date;
  DELETE FROM #contact_new;
  DELETE FROM #contact_old;