暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 如何直接更新实体化视图

askTom 2017-06-18
725

问题描述



我们可以直接使用update语句更新实体化视图中的数据吗?如果是,也会更新到表格。如果视图中有多个表格怎么办?

请帮助我。



专家解答

默认情况下,没有。实体化视图不可更新:

create table t (
  x int primary key, y int
);

insert into t values (1, 1);
insert into t values (2, 2);
commit;

create materialized view log on t including new values;

create materialized view mv 
refresh fast with primary key 
as 
  select * from t;
  
update mv
set    y = 3;

ORA-01732: data manipulation operation not legal on this view


但是您可以使用 “for update” 子句来更改MV中的数据:

drop materialized view mv ;

create materialized view mv 
refresh fast with primary key for update 
as 
  select * from t;
  
update mv
set    y = 3;

insert into mv values (3, 3);

select * from mv;

         X          Y
---------- ----------
         1          3
         2          3
         3          3

select * from t;

         X          Y
---------- ----------
         1          1
         2          2


请注意,更改aren't推到基台。刷新后,更改将丢失:

exec dbms_mview.refresh('mv');

select * from mv;

         X          Y
---------- ----------
         1          1
         2          2


那么,如何将更改推送到基表?

简短的答案是你不能。高级复制的这一部分。它用于将更改从远程数据库推送到主数据库。这在12.1中已弃用

https://docs.oracle.com/database/121/REPMA/release_changes.htm#REPMA1356

所以我不建议使用这个。如果您真的愿意,可以在以下位置找到一个有效的示例:

http://www.vinayagaconsultancyltd.co.uk/blogs/advanced-replication/updatable-materialized-view

或者你可以阅读MOS笔记759196.1。这给出了该过程如何工作的详细描述。包括如果您对表和MV编写冲突的更改会发生什么!
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论