Oracle-创建不更新旧数据的增量视图

是否可以创建一个仅增量的物化视图?我希望已经插入的旧数据不被更新,只有新的插入应该包含在视图中

如果可能,我该怎么做?

是否有任何文档或任何我可以用作指南的地方?

回答

如果您想在插入 MV 时查看每一行,简短的回答是:

你不能。

Amaterialized view存储查询的结果,因为它现在存在,而不是过去的某个时间。因此,在更新一行后,您可以查看其当前值或将其从 MV 中排除。

如果您想在插入时保留/查看数据的状态,您有几个选择:

  • 使表仅插入(可能在表中存储更改历史记录)
  • 在将数据添加(例如通过触发器)到另一个表时捕获数据
  • 使用Flashback Data Archive存储更改历史并使用Flashback Query查看

其中哪一个最合适取决于您为什么需要在插入时查看数据。


从技术上讲,可以在插入时查看数据 - 直到某一点。

使用闪回版本查询,您可以看到表格随时间的变化。所以你可以做这样的事情:

create table t (
  c1 int, c2 int,
  insert_date timestamp,
  update_date timestamp
);

exec dbms_session.sleep(10);

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

commit;

create materialized view mv 
as 
  select t.*
  from t 
    versions between scn minvalue 
    and maxvalue
where versions_operation = 'I';

exec dbms_session.sleep(10);

update t
set    c2 = 9999, 
       update_date = systimestamp
where  c1 = 2;

insert into t values ( 3, 3, systimestamp, systimestamp );

commit;

exec dbms_mview.refresh ( 'mv' );

select * from t;

C1      C2 INSERT_DATE                       UPDATE_DATE                      
 1       1 26-JUL-2021 13.49.51.666954000    26-JUL-2021 13.49.51.666954000    
 2    9999 26-JUL-2021 13.49.51.712259000    26-JUL-2021 13.50.08.421872000    
 3       3 26-JUL-2021 13.50.08.462300000    26-JUL-2021 13.50.08.462300000  

select *
from   mv;

C1    C2 INSERT_DATE                       UPDATE_DATE                      
 3     3 26-JUL-2021 13.50.08.462300000    26-JUL-2021 13.50.08.462300000    
 2     2 26-JUL-2021 13.49.51.712259000    26-JUL-2021 13.49.51.712259000    
 1     1 26-JUL-2021 13.49.51.666954000    26-JUL-2021 13.49.51.666954000  

这使用撤消来重建历史。最终,较旧的更改将消失,您将返回仅查看当前状态。默认情况下,您只能获得15 分钟的更改!

如果您想长时间存储历史记录,Flashback Data Archive 是您的最佳选择。


以上是Oracle-创建不更新旧数据的增量视图的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>