如何确保将 Oracle 物化视图创建为“可写”物化视图而不是“可更新”物化视图?我从不希望这些视图将数据推送回源,我希望完全刷新以覆盖我更改的任何内容。
根源问题是其中一个远程数据库不支持物化视图日志,但表有最后修改的时间戳列。因此,我想尝试通过在该列上过滤 Merge 语句使它们保持最新,然后如果出现任何问题,偶尔会进行正常的复制刷新。
我试过了CREATE MATERIALIZED VIEW Test.SomeTable_MVW TABLESPACE SOME_DATA BUILD DEFERRED REFRESH COMPLETE FOR UPDATE AS (SELECT ... FROM SomeTable@OverThere);
但我得到了错误:
12013. 00000 - "updatable materialized view must be simple enough and have a materialized view log on its master table to do fast refresh"
*Cause: The updatable materialized view query contained a JOIN, SUBQUERY,
UNION, CONNECT BY, ORDER BY, or GROUP BY clause, or the master
table did not have a materialized view log.
*Action: Make the materialized view simpler. If a join is really needed,
make multiple simple materialized views then put a view on top of
them. Make sure a materialized view log is created for the master
table.
只有一张远程桌子。我不明白为什么甚至包含此错误,or the master table did not have a materialized view log
因为这就是您获得可写物化视图的方式。太糟糕了,当您知道不想将数据推回时,没有“FOR WRITEABLE”子句。并且 REFRESH COMPLETE 应该提示我不想将数据推回。
可更新的物化视图是高级复制功能。可写物化视图只是一个可更新的物化视图,它不是物化视图(复制)组的成员。
取消对高级复制的支持
您正在为 7 年前(在 12.1 中)被弃用并在 4 年前(12.2)中被取消支持的功能寻找解决方案。
为了向后兼容,该
FOR UPDATE
子句仍然存在,但它甚至不再记录在案。我不知道甲骨文为什么以这种方式实现它,但在这一点上,我会放手。
对于您描述的用例,一个简单的表就可以了。
truncate
您可以在键 + 时间戳上使用 MERGE 进行增量刷新,并使用+进行完全刷新insert ... select ...
。