同期と同期の間に複数のデータベースでローが更新されると、競合が発生します。アップロード内の各更新操作には、更新中のローの更新前イメージが含まれているので、Mobile Link サーバーは競合を検出することができます。更新前イメージは、最後にアップロードまたはダウンロードに成功したローの全カラムの値です。アップロードが提供されたときに、更新前イメージが統合データベースの値と一致しないと、Mobile
Link サーバーは競合を検出します。
削除操作では、アップロードされたローのプライマリキーが正しいことが重要です。しかし、非プライマリキーカラムの値が、統合データベースの値と一致しているかどうかは問題ではありません。非プライマリキーカラムが重要なのは、Mobile Link サーバーで強制的な競合モードが使用されるときだけです。この場合、カラムのすべての値が、統合データベースの
upload_old_row_insert スクリプトに渡されます。このスクリプトを実装した方法によっては、非プライマリキーカラムを正しい値にする必要があります。
通常、リモートデータベースで各操作をアップロードするのは、一度だけです。この操作を支援するため、Mobile Link は各サブスクリプションの進行状況値を維持します。進行状況値は、デフォルトで、dbmlsync が正常な最終アップロードを構築し始めた時間です。この進行状況値は、sp_hook_dbmlsync_set_upload_end_progress
フックを使用して異なる値で上書きできます。
//
// DO NOT DO THIS!
//
CREATE TABLE t1 (
pk integer primary key,
val varchar( 256 ),
to_upload bit DEFAULT 1
);
CREATE PROCEDURE t1_ins()
RESULT( pk integer, val varchar(256) )
BEGIN
SELECT pk, val
FROM t1
WHERE to_upload = 1;
END;
CREATE PROCEDURE sp_hook_dbmlsync_upload_end()
BEGIN
DECLARE upload_status varchar(256);
SELECT value
INTO upload_status
FROM #hook_dict
WHERE name = 'upload status';
if upload_status = 'committed' THEN
UPDATE t1 SET to_upload = 0;
END IF
END;
CREATE PUBLICATION p1 WITH SCRIPTED UPLOAD (
TABLE t1 USING ( PROCEDURE t1_ins FOR UPLOAD INSERT )
);