2016-11-10 209 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

相關問題