这可能是不可能的,但我希望看看是否有一种平易近人的方法来运行带有视图的表的在线替换。
对于分区等在线表重组,DBMS_REDEFINITION 效果很好。但我想用(物化)视图替换表,所以 DBMS_REDEFINITION 似乎不合适。
在重命名期间,我无需担心任何约束、依赖关系或变异 dml 等;我只想在用视图替换表时保持目标 SELECTable。下面是一个捏造的例子。
CREATE TABLE SCI_FI_MOVIE (
SCI_FI_MOVIE_ID NUMBER(10, 0) NOT NULL PRIMARY KEY,
NAME VARCHAR2(100) UNIQUE NOT NULL,
DIRECTOR VARCHAR2(100) NOT NULL,
REVIEW_SCORE NUMBER(1, 0) CHECK ( REVIEW_SCORE IN (1, 2, 3, 4, 5))
);
CREATE TABLE NO_SCORES_SCI_FI_MOVIE (
SCI_FI_MOVIE_ID NUMBER(10, 0) NOT NULL PRIMARY KEY,
NAME VARCHAR2(100) UNIQUE NOT NULL,
DIRECTOR VARCHAR2(100) NOT NULL
);
CREATE MATERIALIZED VIEW KUBRICK_SABOTAGE
(SCI_FI_MOVIE_ID, NAME, DIRECTOR, REVIEW_SCORE)
REFRESH COMPLETE ON COMMIT
AS
SELECT
SCI_FI_MOVIE_ID,
NAME,
DIRECTOR,
CASE WHEN DIRECTOR = 'KUBRICK'
THEN 5
ELSE 2 END AS REVIEW_SCORE
FROM NO_SCORES_SCI_FI_MOVIE;
INSERT INTO SCI_FI_MOVIE VALUES (1, 'Apollo 13', 'HOWARD', 5);
INSERT INTO SCI_FI_MOVIE VALUES (2, '2001: A Space Odyssey', 'KUBRICK', 4);
INSERT INTO NO_SCORES_SCI_FI_MOVIE VALUES (1, 'Apollo 13', 'HOWARD');
INSERT INTO NO_SCORES_SCI_FI_MOVIE VALUES (2, '2001: A Space Odyssey', 'KUBRICK');
COMMIT;
-- THEN WHAT STEPS TO REPLACE TABLE WITH VIEW?
在此示例中,我希望以名为 SCI_FI_MOVIE 的 MV 和重命名为 SCI_FI_MOVIE_TEMP 的 TABLE SCI_FI_MOVIE 或任何待删除的内容结束。如果替换可以原子地完成,则在替换原始表之前不需要存在 MV
我想避免对对象名称解析的任何中断或妥协(CREATE PUBLIC SYNONYM
然后重命名原始在这里不起作用)
有没有一种干净的无停机方式来做到这一点?
我可以根据需要随意禁用日志记录、只读等任何内容;唯一的目标是在字典切换期间防止“ORA-00942:表或视图不存在”。我使用的是 11gR2,但也欢迎使用 12c 解决方案。
非常感谢你的想法