Se você tiver a edição empresarial 10g, deve consultar a Auditoria Refinada da Oracle. É definitivamente melhor do que rolar o seu próprio.
Mas se você tem uma versão menor ou por algum motivo FGA não é do seu gosto, aqui está como fazê-lo. O principal é:criar uma tabela de auditoria separada para cada tabela de aplicativos .
Eu sei que isso não é o que você quer ouvir porque não corresponde à estrutura da tabela descrita acima. Mas armazenar uma linha com valores OLD e NEW para cada coluna afetada por uma atualização é uma péssima ideia:
- Não é dimensionado (uma única atualização tocando dez colunas gera dez inserções)
- E quando você insere um registro?
- É muito chato reunir o estado de um registro a qualquer momento
Portanto, tenha uma tabela de auditoria para cada tabela de aplicação, com uma estrutura idêntica. Isso significa incluir CHANGED_TIMESTAMP e CHANGED_USER na tabela de aplicativos, mas isso não é ruim.
Finalmente, e você sabe onde isso está levando, tenha um gatilho em cada tabela que insira um registro inteiro com apenas os valores :NEW na tabela de auditoria. O gatilho deve ser acionado em INSERT e UPDATE. Isso dá a história completa, é fácil diferenciar duas versões do registro. Para um DELETE, você inserirá um registro de auditoria apenas com a chave primária preenchida e todas as outras colunas vazias.
Sua objeção será que você tem muitas tabelas e colunas demais para implementar todos esses objetos. Mas é bastante simples gerar a tabela e acionar instruções DDL do dicionário de dados (user_tables, user_tab_columns).