リモート・データベースからローを削除するには、download_delete_cursor スクリプトを作成します。このスクリプトは、同期中に削除するローを含む、リモート・データベースの各テーブルに対して 1 つ作成してください。
統合データベースからのローの削除のみを実行し、リモート・データベースからローを消去することはできません。削除されたローのプライマリ・キーを download_delete_cursor で選択できるようにするため、そのローのプライマリ・キーを追跡する必要があります。こうするには、以下の 2 つの一般的な方法があります。
論理削除 統合データベースのローを物理的に削除しないでください。その代わり、ローが有効であるかどうかを追跡するステータス・カラムを使用します。このようにすると、download_delete_cursor を簡略化できます。ただし、ステータス・カラムを認識して使用できるように、download_cursor とその他のアプリケーションを修正しなければならない場合があります。削除の時刻を保持する最終変更カラムが存在し、各リモートの最終ダウンロード時刻の追跡を行っている場合は、すべてのリモートのダウンロード時刻が削除の時刻よりも早ければ、ローを物理的に削除できます。
シャドー・テーブル 削除に関する追跡を実行する各テーブルには、テーブルのプライマリ・キーを保持するカラムとタイムスタンプを保持するカラムの 2 つを含むシャドー・テーブルを作成します。ローが削除されたときにプライマリ・キーとタイムスタンプをシャドー・テーブルに挿入するトリガを作成します。このようにすると、download_delete_cursor はこのシャドー・テーブルから選択できるようになります。論理削除と同様に、すべてのリモート・データベースによって対応するデータがダウンロードされれば、シャドー・テーブルからローを削除できます。
Mobile Link サーバは、統合データベースからプライマリ・キー値を選択し、それらをリモート・データベースに渡すことによって、リモート・データベースのローを削除します。値がリモート・データベース内のプライマリ・キーの値と一致する場合、そのローを削除します。
各 download_delete_cursor スクリプトには、SELECT 文か、結果セットを返すストアド・プロシージャの呼び出しが必要です。Mobile Link サーバは、SELECT 文を使用して統合データベース内でカーソルを定義します。
SELECT 文では、リモート・データベース内のテーブルのプライマリ・キー・カラムに対応するすべてのカラムを選択します。統合データベース内のカラムは、対応するリモート・データベースのカラムとは異なる名前にできますが、互換性のある型にしてください。
値は、対応するカラムがリモート・データベース内で定義されている順序に従って選択します。この順序は、テーブルの作成に使用される CREATE TABLE 文のカラム順と同じですが、プライマリ・キーを定義する文中のカラム順とは異なります。
親レコードを削除すると、子レコードも自動的に削除されます。
子レコードの削除の詳細については、参照整合性と同期を参照してください。
各 download_delete_cursor スクリプトでは、対応するリモート・テーブルのプライマリ・キーに存在するすべてのカラム値を選択する必要がありますが、その他のすべてのカラムを選択することも可能です。この機能は、古いクライアントとの互換性を保つためだけにあります。追加のカラムを選択すると、データベース・サーバが取得しなければならないデータが増え、効率が悪くなります。古いクライアント以外については、Mobile Link サーバが追加の値を即座に破棄します。追加の値は、古いクライアントにのみダウンロードされます。
Mobile Link はすべての NULL を含むローの download_delete_cursor を検出すると、リモート・データベース内のデータをすべて削除します。download_delete_cursor 内の NULL の数は、プライマリ・キー・カラムの数またはテーブル内のカラムの総数です。
たとえば、次の download_delete_cursor SQL スクリプトは、2 つのプライマリ・キー・カラムがあるテーブル内のすべてのローを削除します。この例は、SQL Anywhere、Adaptive Server Enterprise、Microsoft SQL Server のデータベースに適用されます。
SELECT NULL, NULL |
IBM DB2 LUW と Oracle の統合データベースでは、ダミー・テーブルを指定して NULL を選択してください。IBM DB2 LUW 7.1 では、次の構文を使用できます。
SELECT NULL, NULL FROM SYSIBM.SYSDUMMY1 |
Oracle 統合データベースでは、次の構文を使用できます。
SELECT NULL, NULL FROM DUAL |
次の例は、従業員情報を格納しているリモート・テーブルに対する download_delete_cursor スクリプトです。Mobile Link サーバは、この SQL 文を使用して削除カーソルを定義します。このスクリプトは、スクリプトの実行時に統合データベースとリモート・データベースの両方に存在するすべての従業員の情報を削除します。
SELECT emp_id FROM employee |
download_delete_cursor は、パラメータ last_download と ml_username を受け入れます。次のスクリプトは、各パラメータを使用して選択範囲を絞る方法を示しています。
SELECT order_id FROM ULOrder WHERE last_modified >= {ml s.last_table_download} AND status = 'Approved' AND user_name = {ml s.username} |
一部の統合データベースでは、適切なデータ型にキャストする必要があります。CAST 関数 [データ型変換]を参照してください。
上記の例は、従業員数の多い組織では効率的ではない場合があります。リモート・データベースにあるローだけを選択すると、削除処理をより効率的に行えます。たとえば、最近新しくマネージャになった人だけを選択すると、ロー数を制限できます。また、クライアント・アプリケーションにロー自体を削除させるという方法もあります。この方法は、不必要なローをルールによって識別できる場合のみ可能です。たとえば、有効期限を示すタイムスタンプがローに含まれている場合があります。次回の同期時にこれらの削除がアップロードされるのを停止するには、STOP SYNCHRONIZATION DELETE 文を使用してからローを削除します。他の削除を通常の方法で同期する場合は、この後ですぐに START SYNCHRONIZATION DELETE を実行してください。
download_delete_cursor スクリプトには、プライマリ・キー・カラムをリモート・データベースで定義されたときと同じ順序で含めてください。
効率良くローを削除するには、すべての Mobile Link クライアントに組み込まれている参照整合性検査を使用します。参照整合性と同期を参照してください。
download_delete_cursor スクリプトの使用の詳細については、以下を参照してください。
Copyright © 2009, iAnywhere Solutions, Inc. - SQL Anywhere 11.0.1 |