我有三个 oracle 环境。如果我对 DEV 环境中的数据进行更改,我希望能够接受这些更改并将它们移动到我的其他环境中。
挑战在于其他环境中的数据不会具有相同的主键。因此,比较必须查看表中的其他列。如果该表引用了另一个表,则它也必须包含该表中的列。
因此,例如,表 A 可能有 4 个列,这些列都是其他表的 ID,因此操作表 A 需要引用其他表。任何人都可以为此推荐产品吗?
更新要求:目前的系统无法更改。ID 永远不会同步。同步只能在需要时进行(在我们每两个月更新一次之后)。不能通过 DB 链接进行同步(尽管 DEV 系统可以通过 DB 链接读取数据)。我绝对可以编写 SQL 来完成这一切,它只是那种容易出错(和拼写错误)的事情,如果有一个 3rd 方应用程序可以为我解决这个问题,我宁愿花钱。
根据要求进行更新:所有系统都是 11g Enterprise。数据量很小,带宽不是问题。同步每隔几个月发生一次。基本上,我们有规则告诉我们的 UI 如何表现。这些规则存储在各种表中。我们会不时更改这些规则。这可以是数千条记录,但不是数万条。我们不希望从“实时”数据中获得那种同步。我需要做的是指定两个数据库实例和有问题的表,然后生成一个 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'
);