Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Oracle - Triggers para criar uma linha de histórico na atualização


Ok, isso é uma reescrita. O que eu perdi quando respondi pela primeira vez é que o aplicativo está armazenando seu histórico na tabela principal. Agora eu entendo porque @NickCraver pede desculpas pelo código.

Bem, a primeira coisa a fazer é caçar os autores desse projeto e garantir que eles nunca mais façam isso. Armazenar histórico como esse não é dimensionado, torna as consultas normais (não históricas) mais complicadas e sabota a integridade relacional. Obviamente, existem cenários em que nada disso importa, e talvez seu site seja um deles, mas em geral esta é uma implementação muito ruim.

A melhor maneira de fazer isso é Oracle 11g Total Recall . É uma solução elegante, com uma implementação completamente invisível e eficiente, e - pelos padrões de outros extras cobráveis ​​da Oracle - com um preço bastante razoável.

Mas se o Total Recall estiver fora de questão e você realmente precisar fazer isso, não permita atualizações . Uma alteração em um registro CONTACT existente deve ser uma inserção. Para fazer isso funcionar, você pode precisar construir uma visão com um gatilho INSTEAD OF. Ainda é nojento, mas não tão nojento quanto o que você tem agora.

A partir do Oracle 11.2.0.4, o Total Recall foi renomeado para Flashback Archive e está incluído como parte da Enterprise License (embora despojada das tabelas de diário compactadas, a menos que adquiramos a opção Advanced Compress).

Essa generosidade da Oracle deveria tornar o FDA a maneira normal de armazenar o histórico:é eficiente, é performático, é um Oracle integrado com sintaxe padrão para suportar consultas históricas. Infelizmente, espero ver implementações incompletas com gatilhos mal-feitos, chaves primárias quebradas e desempenho horrível por muitos anos ainda. Porque o journalling parece ser uma daquelas distrações que agradam aos desenvolvedores, apesar do fato de ser um encanamento de baixo nível que é amplamente irrelevante para 99,99% de todas as operações de negócios.