この記事ではリリースノートにおいて SharePlexでサポートしない旨の記述がなされている'UPDATE WITH CASE'構文により変更される行 について説明します。
* SharePlex does not support the following for any table type
- Replication of rows changed by 'UPDATE WITH CASE' syntax.
以下の例のように既存の2つの行の間でユニークキーの列の値を交換するするようにCASEステートメントを伴うソース側テーブルを更新する場合、ターゲットでは一意制約違反により非同期になります。
ソースでは一つのUpdateで両方の行を更新するため一意制約違反は起きません。ターゲットでは SharePlex PostプロセスはRedoログに書かれている内容に基づいて各行へのUpdateステートメントを実行します。そのため、一意制約違反が生じます。
例
次のように定義されたテーブルtestとインデックスtestidxがありソースからターゲットへSharePlexによる複製の設定がされているとします。
create table test (
id number,
id1 number,
id2 number,
name varchar2(10)
)
;
alter table test add primary key (id);
create unique index testidx on test (id1, id2);
ここでソース側でテーブルへ行を追加します。
insert into test values (1,1,1,’test’);
insert into test values (2,2,1,’test’);
commit;
次に以下のようなCASE付きのUpdateを実行します
update test set id1= case when id=1 then 2 when id=2 then 1 else id1 end where (id=1) or (id=2); commit;
ターゲット側で一意制約違反(ORA-00001)が発生して非同期となります。
ソース側ではOracleにより 一意制約違反が抑えられますが、
REDOログではUpdateする行数分だけそれぞれ1行の DMLとして記録されており、それを利用するSharePlexでは、
ターゲット側は次のような行ごとに異なるUPDATEを実行することで一意制約違反が生じてしまいます。
update test set id1=1 where id=2;
commit;
© 2024 Quest Software Inc. ALL RIGHTS RESERVED. 利用規約 プライバシー Cookie Preference Center