oracle - ruta - refrescar vista materializada cada media hora
¿Por qué ocurre un error ORA-12054 al crear este ejemplo de vista materializada simple? (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
No puedo entender qué está mal aquí, sé que si elimino la cláusula DISTINCT funciona, pero ¿por qué no puedo usar ''DISTINCT'' si especifico ''REFRESH COMPLETE ON COMMIT'' que es necesario?
Si utilizo DISTINCT y REFRESH bajo demanda no hay problema, pero estos no son los requisitos.
"Tal vez el ejemplo no sea el mejor, porque quiero ampliar la vista a una consulta más complicada que requerirá una palabra clave distinta, en este momento solo estoy tratando de que funcione en un nivel básico".
DISTINCT es la causa del 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>
¿Por qué no comenzar con algo que funciona ? Retire el DISTINCT. Haz que tu MView funcione. Luego, complételo más tarde cuando sea necesario.
Aunque, como ya sabe, no puede usar DISTINCT, tendrá que revisar la lógica de su consulta o su estrategia de actualización.
Parece que con la adición de DISTINCT, ha hecho que el SQL subyacente de su vista no sea elegible para una actualización rápida y, por lo tanto, no se pueda usar con ON COMMIT (incluso si especifica la actualización completa en lugar de actualizar rápidamente). De los documentos de Oracle :
Los dos modos de ejecución de actualización son ON COMMIT y ON DEMAND. Dependiendo de la vista materializada que cree, algunas de las opciones pueden no estar disponibles. La Tabla 8-4 describe los modos de actualización.
Tabla 8-4 Modos de actualización
EN COMPROMISO
La actualización se produce automáticamente cuando se confirma una transacción que modificó una de las tablas de detalles de la vista materializada. Esto se puede especificar siempre que la vista materializada sea rápidamente renovable (en otras palabras, no compleja). El privilegio ON COMMIT es necesario para usar este modo.
BAJO DEMANDA
La actualización ocurre cuando un usuario ejecuta manualmente uno de los procedimientos de actualización disponibles contenidos en el paquete DBMS_MVIEW (REFRESH, REFRESH_ALL_MVIEWS, REFRESH_DEPENDENT).
El mismo enlace al documento tiene una lista de restricciones para una actualización rápida también.
Lo importante a tener en cuenta sobre la pregunta es que no se trata de una actualización rápida, sino de una actualización completa. Por lo tanto, no existe una razón lógica para aplicar las restricciones habituales para la actualización rápida en la confirmación, excepto que todos los objetos a los que se hace referencia deben ser locales.
La "actualización completa de la confirmación" es una característica relativamente nueva, por lo que la mejor respuesta a la pregunta "por qué" probablemente sea "Oracle todavía no ha implementado completamente, revise las futuras versiones de la base de datos Oracle". No muy útil, pero cierto ... .