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 是您的最佳选择。