2013-01-03 60 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是的,这将是很好的,但它取决于他的应用程序/系统的体系结构和复杂性。也许他可以更新第二个表格并从视图中读取(我的意思是触发器可能不是必需的) –