我正在考虑一种以 Oracle 不希望的方式使用物化 View 日志的解决方案。 这个想法是为 Oracle 源和非 Oracle 目标实现快速刷新 MV 功能。 我已经测试了这种方法以确认它有效,但我担心这种意外和不受支持的使用的长期后果。
MY_TAB 是我想在另一个非 Oracle RDBMS 中镜像的 Oracle (11.2) 表。
目标表的引用由源数据库中的 Oracle 过程调用的外部进程应用。 该进程接受从 MV 日志中提取的数据集,并将更改应用于目标。 成功执行后,已处理的更改将从 MV 日志中删除。
MLOG$_MY_TAB 是创建为 MY_TAB 的 MV 日志:
CREATE MATERIALIZED VIEW LOG ON my_tab
WITH PRIMARY KEY;
注意:不会有与此 MV 日志关联的 MV。
referesh 过程是通过调用以下过程来调用的:
BEGIN
SELECT *
FROM mlog$_my_tab;
/* Call externall process and pass the data */
DELETE mlog$_my_tab;
COMMIT;
END;
除了一般的意外/不受支持的问题之外,是否有人发现此方法有任何具体问题?
最佳答案
根据我的上述评论,我想建议修改方法。创建一个新表说 mv_log_replica。该表应该是您的 mv_log 表的副本。
BEGIN
DELETE FROM mv_log_replica;
INSERT INTO mv_log_replica
(
pk_col,
col1,
col2)
SELECT
pk_col,
col1,
col2
FROM mlog$_my_tab;
/* Call externall process and pass the data */
/* Here instead of mlog$_my_tab use the mv_log_replica table */
DELETE FROM mlog$_my_tab a
WHERE EXISTS (SELECT 1 FROM mv_log_replica b WHERE a.pk_col = b.pk_col);
COMMIT;
END;
这种方法将确保您只删除复制到 mv_log_replica 表的数据。如果任何额外的数据被插入到 mv_log 之间,它不会被删除。此外,您可以使 mv_log_replica 成为全局临时表(ON COMMIT DELETE ROWS)。
关于oracle - 破解 MV 日志以捕获变更数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38732414/