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 サーバ・テクノロジの使用 » 同期の方法 » ユニークなプライマリ・キーの管理

 

プライマリ・キー・プールの使用

ユニークなプライマリ・キーのこの問題を解決する効果的な方法の 1 つは、データベースの各ユーザに、必要に応じて使用できるプライマリ・キー値のプールを割り当てることです。たとえば、営業担当者ごとに 100 個の新しい ID 値を割り当てます。各営業担当者は、自分のプール内の値を、新しい顧客に自由に割り当てることができます。

♦  プライマリ・キー・プールを実装するには、次の手順に従います。
  1. 統合データベースと各リモート・データベースに新しいテーブルを追加して、新しいプライマリ・キー・プールを格納します。ユニークな値を格納するカラムとは別に、これらのテーブルにはユーザ名を格納するカラムが必要です。このユーザ名のカラムによって、値を割り当てる権限を持つ者を識別できます。

  2. ストアド・プロシージャを作成し、十分な数の新しい ID 値が各ユーザに確実に割り当てられるようにします。新しいエントリを多数挿入する、または同期をあまり行わないリモート・ユーザには、特に多く、新しい値を割り当てます。

  3. download_cursor スクリプトを作成して、各ユーザに割り当てられた新しい値を選択し、それをリモート・データベースにダウンロードします。

  4. リモート・データベースを使用するアプリケーションを変更し、ユーザが新しいローを挿入するときに、プールに入っている値をアプリケーションが使用するようにします。アプリケーションは、その値をプールから削除して、値の再使用を防ぎます。

  5. アップロード・スクリプトを作成します。ユーザがリモート・データベースの自分専用の値プールから削除した値と対応するローが、Mobile Link サーバによって、統合データベースの値のプールから削除されます。

  6. end_upload スクリプトを作成し、値のプールを管理するストアド・プロシージャを呼び出します。これで、ユーザのプールに対してさらに多くの値が追加され、削除済みの値がアップロード中に置き換わります。

リモート・ユーザは、サンプル・アプリケーションを使って顧客を追加できます。新しいローにはそれぞれユニークなプライマリ・キー値があることが必要です。ただし、データ・エントリ中は、まだ各リモート・データベースは切断された状態です。

ULCustomerIDPool にはプライマリ・キー値のリストがあり、この値を各リモート・データベースで使用できます。また、値を使い切ってしまうと、ULCustomerIDPool_maintain ストアド・プロシージャによってプール内の値が完全に補充されます。管理プロシージャは、テーブルレベルの end_upload スクリプトによって呼び出されます。各リモート・データベースのプールは、upload_insert スクリプトと download_cursor スクリプトによって管理されます。

  1. 統合データベースの ULCustomerIDPool テーブルには、新しい顧客 ID 番号のプールが格納されます。ULCustomer テーブルとは直接のリンク関係はありません。

    ULCustomerIDPool テーブル、ULEmployee テーブル、ULCustomer テーブル。
  2. ULCustomerIDPool_maintain プロシージャによって、統合データベースの ULCustomerIDPool テーブルが更新されます。SQL Anywhere 統合データベース用のサンプル・コードを次に示します。

    CREATE PROCEDURE ULCustomerIDPool_maintain ( IN syncuser_id INTEGER )
    BEGIN
        DECLARE pool_count INTEGER;
    
        -- Determine how may ids to add to the pool
        SELECT COUNT(*) INTO pool_count
        FROM ULCustomerIDPool
        WHERE pool_emp_id = syncuser_id;
     
        -- Top up the pool with new ids
        WHILE pool_count < 20 LOOP
          INSERT INTO ULCustomerIDPool ( pool_emp_id )
          VALUES ( syncuser_id );
          SET pool_count = pool_count + 1;
        END LOOP;
    END

    このプロシージャは、現在のユーザに現在割り当てられている番号をカウントします。また、新しいローを挿入して、このユーザが十分な数の顧客 ID 番号を使用できるようにします。

    このプロシージャは、ULCustomerIDPool テーブル用の end_upload テーブル・スクリプトによって、アップロードの最後に呼び出されます。スクリプトを次に示します。

    CALL ULCustomerIDPool_maintain( {ml s.username} )
  3. ULCustomerIDPool テーブル用の download_cursor スクリプトは、リモート・データベースに新しい番号をダウンロードします。

    SELECT pool_cust_id
    FROM ULCustomerIDPool
    WHERE pool_emp_id = {ml s.username}
    AND last_modified >= {ml s.last_table_download}
  4. 新しい顧客を挿入するには、リモート・データベースを使用しているアプリケーションで、プール中の未使用の ID 番号を選択して、その番号をプールから削除してから、この ID 番号による新しい顧客情報を挿入します。次に示す Ultra Light アプリケーション用の Embedded SQL 関数は、プールから新しい顧客番号を取り出します。

    bool CDemoDB::GetNextCustomerID( void )
    /*************************************/
    {
        short ind;
    
        EXEC SQL SELECT min( pool_cust_id )
        INTO :m_CustID:ind FROM ULCustomerIDPool;
        if( ind < 0 ) {
            return false;
        }
        EXEC SQL DELETE FROM ULCustomerIDPool
        WHERE pool_cust_id = :m_CustID;
        return true;
    }