2016-11-10 156 views
1

我有本地和远程数据库。 本地数据库是远程数据库的副本。 我必须从远程数据库插入新的记录到本地数据库。 远程数据库中有14个表,所以我需要跟踪所有14个表中的更改。将新记录从一个数据库复制到另一个数据库

我知道我可以选择远程数据库中的每个表,并检查记录是否存在于本地数据库中,如果没有,则插入它。

有没有另一种方法呢?在Java也许? 什么方法是最好的?

+3

我认为数据库管理系统更快速和安全,如果你想通过抛出Java,也许这可能需要时间,你试过dblink为例? –

+2

速度是问题中最少的。考虑两个DB之间的同步和一致性... – FDavidov

+0

什么是数据量?与数十亿条记录的14个表相比,14个表中的几百条记录是一个不同的(而且是微不足道的)问题。 –

回答

1

如果您只有一个本地数据库并且它始终运行 - 您可以使用远程数据库的触发器插入本地数据库。

顺便说一句:从本地手动检查远程手机不是一个好主意。如果现有的远程记录发生了变化,但本地仍然具有旧值?

还有一些Oracle工具可以在数据库之间进行复制和同步。最好挖掘它。

+0

我没有访问远程数据库,只有选择,并授予更新权限。是的,我认为我需要同步。你知道哪些工具最简单易用吗? – user1598696

+0

对不起,我在那个地区工作了很久,可能不知道最新的。无论如何,技术或工具有DBA,你不能将它们作为一个简单的用户应用(只有SELECT和UPDATE权限)。 – Vadim

2

让我们DBLINK开始远程DB

CREATE PUBLIC DATABASE LINK REMO 
CONNECT TO <user_name> 
IDENTIFIED BY <password> 
USING '<service_name>'; 

然后用循环在从用户模式中的所有表的插入。或者,如果您只想插入一些表格,请为这14个表格定义适当的条件。

begin 

for x in (select table_name from user_tables) loop 
execute immediate 'insert into ' || x.table_name || ' (select * from ' || x.table_name || '@REMO minus select * from ' || x.table_name || ')'; 

commit; 
end loop; 
end; 
/

这将只插入新记录(实际上存在(或已被更改)在远程上并且不存在于本地的记录)。如果这是你需要的,这将起作用。如果你需要同步,这不是解决方案。

+0

谢谢,我会尽力让你知道 – user1598696

+0

恕我直言:这是适当的解决方案。它也可以扩展到某种“同步”解决方案,以使本地DB与远程DB在定期运行(例如)运行时同步。 – Vadim

相关问题