同期に対する削除の開始/停止方法

ここでは、統合データベース内のレコードを削除せずに Ultra Light データベース内のレコードを削除する方法を説明します。

Adaptive Server Anywhere (SQL Anywhere) 7.0 では、Ultra Light データベースでレコードを削除するときにその削除を統合データベースに同期させないようにする新しい機能が導入されています。すべてのリモート・データベースがローを受信し、それを処理してから削除する場合には、この機能が特に役立ちます。たとえば、ブロードキャスト・メッセージの場合について考えてみます。すべてのユーザに対して新しいメッセージを作成し、各ユーザが同期するとメッセージ・ボックスにローの内容が表示されます。メッセージが表示されたら、そのメッセージをリモート・データベースから削除します。他のリモート・データベースは引き続きメッセージを受信する必要があるため、統合データベースからレコードが削除されないようにします。

SQL 文 ‘STOP SYNCHRONIZATION DELETE’ は、Mobile Link 同期に対する削除のロギングを一時的に停止します。この文が実行されたら、レコードの削除を発行して、最後に SQL 文 ‘START SYNCHRONIZATION DELETE’ を発行します。この SQL 文は、Mobile Link 同期に対する削除のロギングを再開します。この SQL 文を使用する場合は、必要なレコードを統合データベースから Ultra Light データベースに送るために、テーブルについて Mobile Link で定義されたdownload_cursor イベント・スクリプトが必要です。リモート・データベースはローの処理後にそのローを削除するので、download_delete_cursor イベントは必要ありません。

以下は ESQL を使用したサンプル・メソッドであり、上記のプロセスを表しています。このメソッドは、アーティクルの表示終了後にアプリケーションから呼び出されます。

long CULTestDB::DeleteArticle( long articleID )
{
EXEC SQL BEGIN DECLARE SECTION;
long sql_long_id;
EXEC SQL END DECLARE SECTION;

sql_long_id = articleID;

EXEC SQL STOP SYNCHRONIZATION DELETE;

EXEC SQL DELETE FROM ARTICLETITLE
WHERE id = :sql_long_id;

if( SQLCODE == SQLE_NOERROR ) {
EXEC SQL COMMIT;
} else {
EXEC SQL COMMIT;
EXEC SQL START SYNCHRONIZATION DELETE;
return( SQLCODE );
}
EXEC SQL DELETE FROM ARTICLEDETAIL
WHERE id = :sql_long_id;

if( SQLCODE == SQLE_NOERROR ) {
EXEC SQL COMMIT;
} else {
EXEC SQL START SYNCHRONIZATION DELETE;
return( SQLCODE );
}

EXEC SQL START SYNCHRONIZATION DELETE;
return( SQLCODE );
}