ユニークなプライマリ・キーのこの問題を解決する効果的な方法の 1 つは、データベースの各ユーザに、必要に応じて使用できるプライマリ・キー値のプールを割り当てることです。たとえば、営業担当者ごとに 100 個の新しい ID 値を割り当てます。各営業担当者は、自分のプール内の値を、新しい顧客に自由に割り当てることができます。
統合データベースと各リモート・データベースに新しいテーブルを追加して、新しいプライマリ・キー・プールを格納します。ユニークな値を格納するカラムとは別に、これらのテーブルにはユーザ名を格納するカラムが必要です。このユーザ名のカラムによって、値を割り当てる権限を持つ者を識別できます。
ストアド・プロシージャを作成し、十分な数の新しい ID 値が各ユーザに確実に割り当てられるようにします。新しいエントリを多数挿入する、または同期をあまり行わないリモート・ユーザには、特に多く、新しい値を割り当てます。
download_cursor スクリプトを作成して、各ユーザに割り当てられた新しい値を選択し、それをリモート・データベースにダウンロードします。
リモート・データベースを使用するアプリケーションを変更し、ユーザが新しいローを挿入するときに、プールに入っている値をアプリケーションが使用するようにします。アプリケーションは、その値をプールから削除して、値の再使用を防ぎます。
アップロード・スクリプトを作成します。ユーザがリモート・データベースの自分専用の値プールから削除した値と対応するローが、Mobile Link サーバによって、統合データベースの値のプールから削除されます。
end_upload スクリプトを作成し、値のプールを管理するストアド・プロシージャを呼び出します。これで、ユーザのプールに対してさらに多くの値が追加され、削除済みの値がアップロード中に置き換わります。
リモート・ユーザは、サンプル・アプリケーションを使って顧客を追加できます。新しいローにはそれぞれユニークなプライマリ・キー値があることが必要です。ただし、データ・エントリ中は、まだ各リモート・データベースは切断された状態です。
ULCustomerIDPool にはプライマリ・キー値のリストがあり、この値を各リモート・データベースで使用できます。また、値を使い切ってしまうと、ULCustomerIDPool_maintain ストアド・プロシージャによってプール内の値が完全に補充されます。管理プロシージャは、テーブルレベルの end_upload スクリプトによって呼び出されます。各リモート・データベースのプールは、upload_insert スクリプトと download_cursor スクリプトによって管理されます。
統合データベースの ULCustomerIDPool テーブルには、新しい顧客 ID 番号のプールが格納されます。ULCustomer テーブルとは直接のリンク関係はありません。
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} ) |
ULCustomerIDPool テーブル用の download_cursor スクリプトは、リモート・データベースに新しい番号をダウンロードします。
SELECT pool_cust_id FROM ULCustomerIDPool WHERE pool_emp_id = {ml s.username} AND last_modified >= {ml s.last_table_download} |
新しい顧客を挿入するには、リモート・データベースを使用しているアプリケーションで、プール中の未使用の 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; } |
Copyright © 2009, iAnywhere Solutions, Inc. - SQL Anywhere 11.0.1 |