Почему возникает ошибка ORA-12054 при создании этого простого материализованного примера представления?


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 работает, но почему я не могу использовать 'четкая' если я указать полное обновление на совершение которого требуется.

Если я использую DISTINCT и обновить по требованию нет никаких проблем, но это не требования.

3 2

3 ответа:

Похоже, что с добавлением DISTINCT вы сделали базовый SQL вашего представления непригодным для быстрого обновления и поэтому не можете использовать его с фиксацией (даже если вы указываете refresh complete вместо refresh fast). Из Oracle docs:

Два режима выполнения обновления находятся на фиксации и по требованию. Зависящий в созданном вами материализованном представлении некоторые параметры могут отсутствовать. доступный. В таблице 8-4 описаны режимы обновления.

Таблица 8-4 Режимы Обновления

ПРИ ФИКСАЦИИ

Обновление происходит автоматически, когда транзакция, изменившая один из таблицы детализации материализованного представления фиксируют. Это можно указать пока материализованное представление быстро обновляется (другими словами, не сложный). Для использования этого режима необходима привилегия on COMMIT.

ПО ТРЕБОВАНИЮ

Обновление происходит, когда пользователь вручную выполняет один из доступных процедуры обновления, содержащиеся в пакет DBMS_MVIEW (обновить, REFRESH_ALL_MVIEWS, REFRESH_DEPENDENT).

Та же ссылка на документ содержит список ограничений для быстрого обновления.

" Возможно, пример не самый лучший, потому что я хочу расширить представление к более сложному запросу, который потребует отдельного ключевого слова, сейчас я просто пытаюсь заставить его работать на базовом уровне. "

Различное является причиной Ора-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> 

Почему бы не начать с чего-то, что работает? Снять различны. Пусть ваш MView работает. Затем усложните его позже, когда это станет необходимым.

Хотя, как вы уже знаете вы не можете использовать отдельный, вам придется пересмотреть логику запроса или стратегию обновления.

Важно отметить, что речь идет Не о быстром обновлении, а о полном обновлении. Таким образом, нет никакой логической причины, по которой должны применяться обычные ограничения для быстрого обновления при фиксации, за исключением того, что все ссылочные объекты должны быть локальными.

Функция "refresh complete on commit" является относительно новой, поэтому лучший ответ на вопрос" почему", вероятно, " Oracle еще не реализовала это полностью, пожалуйста, проверьте будущие версии Oracle База данных". Не очень полезно, но верно...