3
ALTER TABLE RECORDINGS ADD PRIMARY KEY (ID);

CREATE MATERIALIZED VIEW LOG ON RECORDINGS TABLESPACE USERS NOLOGGING;

DROP MATERIALIZED VIEW REC_SEARCH_TEST;
CREATE MATERIALIZED VIEW REC_SEARCH_TEST
REFRESH COMPLETE ON COMMIT
AS (
    SELECT DISTINCT ID, TITLE FROM RECORDINGS
);


ORA-12054: cannot set the ON COMMIT refresh attribute for the materialized view

无法理解这里有什么问题,我知道如果我取出 DISTINCT 子句它会起作用,但是如果我指定了必需的“REFRESH COMPLETE ON COMMIT”,为什么我不能使用“DISTINCT”。

如果我按需使用 DISTINCT 和 REFRESH 没有问题,但这不是要求。

4

3 回答 3

4

似乎添加了 DISTINCT,您使视图的底层 SQL 不符合快速刷新的条件,因此无法与 ON COMMIT 一起使用(即使您指定刷新完成而不是快速刷新)。来自Oracle 文档

两种刷新执行模式是 ON COMMIT 和 ON DEMAND。根据您创建的具体化视图,某些选项可能不可用。表 8-4 描述了刷新模式。

表 8-4 刷新模式

提交时

当修改了具体化视图的详细信息表之一的事务提交时,刷新会自动发生。只要物化视图可快速刷新(换句话说,不复杂),就可以指定这一点。使用此模式需要 ON COMMIT 权限。

一经请求

当用户手动执行包含在 DBMS_MVIEW 包(REFRESH、REFRESH_ALL_MVIEWS、REFRESH_DEPENDENT)中的可用刷新过程之一时,就会发生刷新。

同一个文档链接也有一个快速刷新的限制列表。

于 2012-01-16T18:09:53.047 回答
1

“也许这个例子不是最好的,因为我想将视图扩展到一个需要不同关键字的更复杂的查询,现在我只是想让它在基本层面上工作。”

DISTINCT 是 ORA-12054 的原因。

SQL> CREATE MATERIALIZED VIEW REC_SEARCH_TEST
    REFRESH COMPLETE ON COMMIT
    AS (
       SELECT DISTINCT empno, ename FROM emp
   )
/
  2    3    4    5    6  
       SELECT DISTINCT empno, ename FROM emp
                                         *
ERROR at line 4:
ORA-12054: cannot set the ON COMMIT refresh attribute for the materialized view


Elapsed: 00:00:01.14
SQL> SQL> 
SQL> CREATE MATERIALIZED VIEW REC_SEARCH_TEST
    REFRESH COMPLETE ON COMMIT
    AS (
       SELECT empno, ename FROM emp
   )
/
  2    3    4    5    6  
Materialized view created.

Elapsed: 00:00:02.33
SQL> 

为什么不从有效的东西开始呢?删除 DISTINCT。让您的 MView 正常工作。然后在必要时将其复杂化。

尽管您已经知道不能使用 DISTINCT,但您将不得不修改查询的逻辑或刷新策略。

于 2012-01-16T19:08:58.667 回答
-1

关于这个问题要注意的重要一点是,它不是关于快速刷新,而是完全刷新。因此,除了所有引用对象都必须是本地的之外,没有任何逻辑上的理由应该适用于提交时快速刷新的通常限制。

“提交时刷新完成是一个相对较新的功能,因此对“为什么”问题的最佳答案可能是“Oracle 尚未完全实现此功能,请检查 Oracle 数据库的未来版本”。不是很有用,但确实如此。 .

于 2013-11-20T09:10:22.927 回答