2

私は3つのOracle環境を持っています。DEV環境のデータに変更を加えた場合、それらの変更を取得して他の環境に移動できるようにしたいと思います。

課題は、他の環境のデータが同じ主キーを持たないことです。したがって、比較では、テーブル内の他の列を確認する必要があります。テーブルが別のテーブルを参照している場合は、そのテーブルの列も含める必要があります。

したがって、たとえば、テーブルAに他のテーブルへのすべてのIDである4つの列がある場合、テーブルAを操作するには、それらの他のテーブルを参照する必要があります。誰かがこれのための製品を提案できますか?

更新された要件:現在のシステムについては何も変更できません。IDが同期することはありません。同期は、必要な場合にのみ行う必要があります(隔月の更新後)。DBリンクを介して同期を行うことはできません(ただし、DEVシステムはDBリンクを介してデータを読み取ることができます)。私は間違いなくこれらすべてを行うためのSQLを書くことができます、それはエラー(およびタイプミス)を起こしやすい種類のものであり、私のためにこれを処理できるサードパーティのアプリケーションがそこにある場合、私はむしろ費やしたいと思いますそのお金。

リクエストに応じたアップデート:すべてのシステムは11gエンタープライズです。データ量は非常に少なく、帯域幅は問題ではありません。同期は数か月ごとに行われます。基本的に、UIの動作方法を指示するルールがあります。これらのルールはさまざまなテーブルに保存されます。時々、私たちはそれらの規則を変更します。これは数千のレコードになる可能性がありますが、数万のレコードにはなりません。「ライブ」データから必要となるような同期は必要ありません。私ができる必要があるのは、2つのデータベースインスタンスと問題のテーブルを指定し、SQLスクリプトを生成して、データベースAからデータベースBに変更を効果的に移動することです。データの性質を考えると、単にターゲットテーブルを切り捨てて、他の環境にデータをsqlloadingすることを検討してきました。そうじゃない

これが私の言いたいことの例を提供するコードです。IDに気付くでしょうが、IDは環境間で一貫していないため、これは注意が必要です。

drop table mydata;
drop table MYTOWN;
drop table MYJOB;
drop table MYEMPLOYER;
drop table mystate;

create table MYJOB
(MYJOBID varchar2(1000)  NOT NULL PRIMARY KEY,
MYJOB varchar2(1000));

create table MYEMPLOYER
(MYEMPLOYERID  varchar2(1000)  NOT NULL PRIMARY KEY,
MYEMPLOYER  varchar2(1000));


create table MYSTATE
(MYSTATEID  varchar2(1000)  NOT NULL PRIMARY KEY,
MYSTATE varchar2(1000));

create table MYTOWN
(MYTOWNID varchar2(1000)  NOT NULL PRIMARY KEY,
MYTOWN varchar2(1000),
MYSTATEID varchar2(1000),
CONSTRAINT MYSTATE_FK FOREIGN KEY (MYSTATEID) REFERENCES MYSTATE (MYSTATEID) ENABLE);


create table MYDATA
(MYDATAID varchar2(1000)  NOT NULL PRIMARY KEY,
MYTOWNID varchar2(1000),
MYJOBID varchar2(1000),
MYEMPLOYERID varchar2(1000),
CONSTRAINT MYTOWN_FK FOREIGN KEY (MYTOWNID) REFERENCES MYTOWN (MYTOWNID) ENABLE,
CONSTRAINT MYJOB_FK FOREIGN KEY (MYJOBID) REFERENCES MYJOB (MYJOBID) ENABLE,
CONSTRAINT MYEMPLOYER_FK FOREIGN KEY (MYEMPLOYERID) REFERENCES MYEMPLOYER (MYEMPLOYERID) ENABLE
);


create sequence mydataid_seq;

insert into myemployer values ('937436',    'Bank Of America');
insert into myemployer values  ('43',   'Google');
insert into myemployer values  ('2',    'Toms Taxi');

insert into myjob  values ('8','Programmer');
insert into myjob  values ('10','Cook');
insert into myjob  values ('5','Driver');

insert into mystate  values ('7643','MA');
insert into mystate  values ('23','CA');
insert into mystate  values ('54','NM');

insert into mytown  values ('4743','BOSTON','7643');
insert into mytown  values ('321','SANDIEGO','23');
insert into mytown  values ('92037','SANTA FE','54');

insert into mydata  values ('78','4743','8','937436');
insert into mydata  values ('23455','321','10','43');
insert into mydata  values ('901','92037','5','2');


--to select a unique row
select mt.mytown, ms.mystate, mj.myjob, me.myemployer
from mydata md, mytown mt, mystate ms, myemployer me, myjob mj
where md.mytownid=mt.mytownid
and mt.mystateid=ms.mystateid
and md.myjobid=mj.myjobid
and md.myemployerid=me.myemployerid;

--to delete a row
delete from mydata md where md.mydataid =
(select md.mydataid 
from mydata md, mytown mt, mystate ms, myemployer me, myjob mj
where md.mytownid=mt.mytownid
and mt.mystateid=ms.mystateid
and md.myjobid=mj.myjobid
and md.myemployerid=me.myemployerid
and mt.mytown='SANDIEGO'
and ms.mystate='CA'
and mj.myjob='Cook'
and me.myemployer='Google');

--to insert a row
insert into mydata (mydataid,mytownid, myjobid, myemployerid)
(select mydataid_seq.nextval, mt.mytownid, mj.myjobid, me.myemployerid
from mytown mt, mystate ms, myemployer me, myjob mj
where mt.mytown='SANTA FE'
and mj.myjob='Programmer'
and me.myemployer='Toms Taxi'
and ms.mystate='NM'
);
4

1 に答える 1

1

Oracle GoldenGate を見てください。 http://www.oracle.com/technetwork/middleware/goldengate/overview/index.html 重い銃のソリューションのようになるかもしれません。

最適なソリューションは、具体的なニーズ (データの量、頻度、変換の量、サーバー間の帯域幅、負荷など) によって異なります。

Oracle には多くのレプリケーション オプションがあります。

アップデート:

GoldenGate についてのアドバイスはまだ現実的ですが、安価な解決策ではありません。

ただし、コーディングのスキルと興味がある場合は、次のことが簡単になる可能性があります。

  1. db-link を使用し、同期ロジックを使用して PLSQL パッケージを記述します。その後、必要なときに呼び出すか、ジョブ/タスクとして定期的に実行できます。中央データベースは他のデータベースを認識し、直接接続を確立できる必要があります。
  2. または、外部アプリケーションを作成してそこに同期ロジックを配置することもできます。データベースは別々の DMZ にある可能性があります。

もちろん、Oracle Streams を使用することもできます (11g エンタープライズには含まれています) が、あなたのケースで追加のコーディングなしで動作することを保証することはできません。したがって、このアプローチは複雑な最初のアプローチになる可能性があります。

場合によっては、本格的なレプリケーション ソリューションを使用すると、それらのセットアップと保守に時間がかかることがあります。あなたの場合、同期だけが必要です。

そして、ある種の既成の無料のソリューションを見つけることができます。しかし、ほとんどの場合、品質に問題があります。だから、私はそれらをお勧めしません。

PS: 2 つのアプローチを使用して、データの不一致を解決できます。

  1. 最も簡単: 各データベースのキー列に異なる開始値を持つ Oracle シーケンスを使用します (重複を防ぐために、最大値も設定することを忘れないでください)。
  2. 通常の解決策: データ モデルを再設計して、オフィス/サーバーに関する情報を含める
于 2012-08-27T20:21:02.870 に答える