概要:この文書では、不一致解決を使用し、Adaptive Server Anywhere のレプリケート時にデータが同期しなくなることを防止する方法について説明します。
問題:
統合データベースとリモート・ユーザで構成されるレプリケーション・システムを想定します。レプリケートは正常に実行されていますが、データが同期していないことがわかったとします。次に例を示します。
1. 両方のデータベースに 'Dave' という値が含まれています。
2. リモート・データベースで 'Dave' という値を更新し、'Craig' に変更します。こ
トし、両方のサイトで最終的に 'Craig'.という値が含まれるようにします。
3. dbremote をリモートで実行し、この変更を統合側に送信します。統合側では、まだ
dbremote を実行して変更を適用していません。
4. その間に、統合データベースに 'Dave' という値を挿入し、それを 'Mike' に変更します。これがシステムで最後に行われた変更になるため、値は両方のサイトでレプリケートされるものと想定しています。最終的には、両方のデータベースに 'Mike' という値が含まれるはずです。
4. その間に、統合データベースに 'Dave' という値を挿入し、それを 'Mike'
に変更します。これがシステムで最後に行われた変更になるため、値は両方のサイトでレプリケートされるものと想定しています。最終的には、両方のデータベースに
'Mike' という値が含まれるはずです。
6. dbremote をリモート側と統合側でもう一度実行した後に、データベースを確認します。統合データベースには
'Craig'、リモート・データベースには 'Mike' という値が含まれています。2
つのデータベースが同期していません。
解決策:
これは想定された動作です。不一致解決というテクニックを使用しないかぎり、デフォルトではこのような動作になります。
このような動作になるテーブル・スキーマ例を次に示します。
create table t1
(
num integer default autoincrement,
name char(30),
last_modified timestamp NULL DEFAULT CURRENT timestamp,
PRIMARY KEY ("num")
);
この問題を回避する方法として、次のものがあります。
次のトリガは、NAME カラムが更新されるごとに、LAST_MODIFIED カラムの値を更新します。
create trigger newTime before update of name
on t1
referencing old as old_time new as new_time
for each row
begin
message 'Update trigger fired -- updated the last_modified column.';
set new_time."last_modified" = now(*);
end
次のような resolve update トリガをデータベースに追加することで、不一致解決を実行できます。
create trigger boom resolve update
on t1
referencing old as old_row new as new_row remote as remote_row
for each row
begin
message 'Resolve update trigger fired!';
if (new_row.last_modified < old_row.last_modified) then
set new_row.name = new_row.name;
end if;
end
上記のトリガを追加した場合は、システムの動作が変更されます。不一致が発生すると、データで最後に実行された変更に基づいて、レプリケートすべき値が特定されます。上記のシナリオでは、dbremote
をリモート側と統合側でもう一度実行した後は、両方のデータベースに 'Mike'
という値が含まれます。
レプリケーション時の不一致解決の詳細については、マニュアルの「Adaptive Server Anywhere の SQL Remote 設計」を参照してください。
|