2013-01-03 110 views
0

我創建了一個快速刷新MV在遠程數據庫使用的語法類似如下:Oracle物化視圖:更新遠程數據庫中的MV?

CREATE MATERIALIZED VIEW MV_TAB1 
REFRESH FAST WITH PRIMARY KEY 
START WITH SYSDATE NEXT SYSDATE+(5/1440) /* 5 MINUTES */ 
FOR UPDATE AS 
SELECT * FROM [email protected]_DB; 

現在在MV_TAB1創建遠程數據庫,是有可能更新MV_TAB1並保持更新,甚至後刷新?我的測試表明,在每次刷新後,我的MV_TAB1更新消失了。有沒有辦法保持本地更新?如果是,如何?

感謝, 阿莫斯

回答

0

MV_TAB1是TAB1 @ SOURCE_DB的圖像,所以你不能把它在同時喜歡TAB1和不同的對TAB1。

如果更新目標表上的某些行,然後在源中更新它們,刷新將覆蓋它們。如果您不更新它們的源代碼,它們將保持更新,只要您使用快速刷新。刷新完成將刪除/截斷遠程表並重新插入所有行。

UPDATE:如果您想對遠程表的更新在刷新有優先級,可以到一些技巧:

1)保持MV,因爲它是做更新(和插入)在姐妹表與相同的DDL。查詢,而不是MV,都將使用這兩個表,是這樣的:

select nvl(a.key, b.key), decode(a.key, null, b.col, a.col) 
from tab1_sister a 
full join mv_tab1 b on (a.key = b.key); 

2)添加列到MV_TAB1(複製它們,除了鍵),並做更新這些列(有可能是MV必須與預建表一起)。如果附加列已完成,請使用它們,否則使用刷新更新的原始列。

+0

對於第一個選項,您需要使用該查詢構建視圖,然後使用INSTEAD OF觸發器來攔截DML。 – APC

+0

@APC是的,這將是很好的,但它取決於他的應用程序/系統的體系結構和複雜性。也許他可以更新第二個表格並從視圖中讀取(我的意思是觸發器可能不是必需的) –