6

レガシー システムと新しい光沢のあるバージョンを比較するために、サイド バイ サイド テストを実行しようとしています。レガシー システムのデータを格納する Oracle データベース テーブル A と、新しいシステムのデータを格納する同等のテーブル B があるため、テストの間、データベースは非正規化されます。(また、従来のシステムとテーブル A は固定されています - 変更は許可されていません)

私がやりたいことは、A での頻度の低い DML 操作が B に伝播できるようにすることです。これを行うためにトリガーのペアから始めましたが、トリガーが実行されるとテーブルが変更され、例外がスローされるという明らかな問題にぶつかりました。

この問題を処理する標準的な方法はありますか? dbms_scheduler を使用するかどうかについて、さまざまなレポートを読みました...

ありがとう、

アンディ

更新: 私は問題全体から抜け出し、すべてのストアド プロシージャが A を更新し、B も更新し、その逆も同様であることを確認しました。

将来同じ問題に直面した場合、彼の提案に従うため、Quassnoi の回答を承認済みとしてマークしました。

テーブルAとBに2つの挿入/更新ステートメントレベルのトリガーを追加することで簡単に機能するようになったため、JosephStyonの回答をマークアップしました。次に、実行されたトリガーに応じて、AまたはBをマスターテーブルとして使用してマージ手順を実行します(最初に、ターゲット テーブルがマージによって変更されることを確認し、そうでない場合は早期に終了します)。

4

4 に答える 4

1

DML ではなく DDL のことですか?

DML を使用すると、テーブルの同期を維持するために Oracle のマルチ マスター レプリケーションを見ることができます。また、この目的のためにツールSymmetricDSを見ることもできます。

DDL で私が知っている唯一の解決策は、やはりOracle の高度なレプリケーションです。

于 2009-06-08T15:18:53.620 に答える
1

以下の 3 つのステートメントをストアド プロシージャに配置し、スケジュールされたジョブとして何度でも実行します。

--Assume that "A" is a master, and "B" needs to be synched

--If no match in "A", delete from "B"
DELETE FROM B
WHERE NOT EXISTS(
                SELECT *
                FROM A
                WHERE A.PRIMARY_KEY = B.PRIMARY_KEY
                );

--If there is a match, but they are different, then update "B"
update 
  (
  select
    a.field1 as new_value1
   ,b.field1 as old_value1
   ,a.field2 as new_value2
   ,b.field2 as old_value2
   ,....
   ,a.fieldN as new_valueN
   ,b.fieldN as old_valueN
  from
    a
   ,b
 where a.primary_key = b.primary_key
 )
set
  old_value1 = new_value1
 ,old_value2 = new_value2
 ,....
 ,old_valueN = new_valueN;


--if the record is new to "A", then insert it into "B"
INSERT INTO B
SELECT *
FROM A 
WHERE NOT EXISTS(
                SELECT *
                FROM B 
                WHERE B.PRIMARY_KEY = A.PRIMARY_KEY
                );
于 2009-06-08T15:21:55.330 に答える
1

Oracle 10g 以降では、非同期プロセスとして変更通知が実装されています。これは自動で、パッケージは Oracle 10g 以降のサーバー インストールに含まれています。

ここでいくつかの情報を見ることができます。

于 2009-06-08T15:22:00.790 に答える