Como posso garantir que uma Visualização Materializada Oracle seja criada como uma visualização materializada "Gravável" e não como uma Visualização "Atualizável"? Eu nunca quero que essas exibições enviem dados de volta à origem e quero uma atualização completa para substituir qualquer coisa que eu altere.
O problema de origem é que um dos bancos de dados remotos não pode suportar logs de exibição materializados, mas as tabelas têm colunas de carimbo de data/hora modificadas pela última vez. Portanto, gostaria de tentar mantê-los atualizados com as instruções Merge filtrando nessa coluna e, ocasionalmente, fazer atualizações normais de replicação se ocorrer algum problema.
eu tenteiCREATE MATERIALIZED VIEW Test.SomeTable_MVW TABLESPACE SOME_DATA BUILD DEFERRED REFRESH COMPLETE FOR UPDATE AS (SELECT ... FROM SomeTable@OverThere);
Mas recebi o erro:
12013. 00000 - "updatable materialized view must be simple enough and have a materialized view log on its master table to do fast refresh"
*Cause: The updatable materialized view query contained a JOIN, SUBQUERY,
UNION, CONNECT BY, ORDER BY, or GROUP BY clause, or the master
table did not have a materialized view log.
*Action: Make the materialized view simpler. If a join is really needed,
make multiple simple materialized views then put a view on top of
them. Make sure a materialized view log is created for the master
table.
Há apenas uma tabela remota. Não entendo por que esse erro contém, or the master table did not have a materialized view log
pois é assim que você obtém uma visualização materializada gravável. Pena que não há uma cláusula "FOR WRITEABLE" para quando você sabe que não deseja enviar dados de volta. E o REFRESH COMPLETE deve indicar que não quero empurrar os dados de volta.
A visualização materializada atualizável era um recurso de Replicação Avançada. Uma visão materializada gravável era simplesmente uma visão materializada atualizável que não era membro de um grupo de visão materializada (replicação).
Desuporte de replicação avançada
Você está procurando uma solução para um recurso que se tornou obsoleto há 7 anos (em 12.1) e sem suporte há 4 anos (12.2).
A
FOR UPDATE
cláusula ainda existe para compatibilidade com versões anteriores, mas nem está mais documentada.Não sei por que a Oracle implementou dessa maneira, mas, neste momento, eu simplesmente deixaria de lado.
Para o caso de uso que você descreveu, uma tabela simples está bem. Você pode fazer atualizações incrementais com MERGE na chave + timestamp e fazer uma atualização completa com
truncate
+insert ... select ...
.