O sistema de auditoria guarda todas as alterações em dados das colunas das tabelas auditadas no sistema. Ele serve como um rastro de alterações no banco de dados, semelhante a um sistema de Change Data Capture que alguns SGBD disponibilizam.

Descrição

A auditoria no Gestor é implementada com triggers de after insert or update or delete em todas as tabelas auditadas.

Os triggers de auditoria são prefixados com o nome DYPE_AUDIT_ e concatenado com o nome da tabela auditada. Esses triggers são criados pela procedure DYPEDEV_REBUILD_TRIGGERS.

Todas as tabelas são auditadas, exceto pelas listadas no where do select que busca a lista das tabelas para criar os triggers de auditoria dentro da DYPEDEV_REBUILD_TRIGGERS.

A tabela AUDITORIA normalmente possui apenas índices nos campos ID_AUDITORIA, ID_OBJETO e DATA, separadamente, um índice para cada campo.

Busca por ID_OBJETO

O tipo de busca mais simples na auditoria é buscar pelo ID_OBJETO na tabela de auditorias. Através de um select * from AUDITORIA where ID_OBJETO = xxxx onde xxxx é o ID do objeto que está se auditando já traz toda a história de inserts, updates ou deletes que esse objeto sofreu.

Como no Gestor existem tabelas especializadas (onde a PK é uma FK para outra tabela) e a maioria das tabelas tem uma correspondência na tabela OBJETOacontece de já vir várias tabelas no resultado da busca por um simples ID, que representam o mesmo objeto.

Por exemplo, o ID_PEDIDO irá trazer dados nas tabelas PEDIDO, ENTRADA, TRANSACAO_NEGOCIO e OBJETO. Mas atenção! Por coincidência, uma tabela que não é uma especialização de objeto pode acabar aparecendo de possuir um ID semelhante. A CFG_SISTEMA e a CFG_STATUS são exemplos de tabelas que não são especializações de OBJETO e podem ter conflito de ID.

Busca por DATA HORA e EXECUTOR

Outro tipo de busca na auditoria é sabendo o exato segundo onde uma operação aconteceu, buscar pelo mesmo usuário todos os objetos afetados por ele naquele segundo.

Uma query do tipo select * from AUDITORIA where ID_EXECUTOR = xxxx and DATA = yyyy and HORA = zzzz onde xxxx é o ID_USUARIO que executou a ação, yyyy é a data em que foi executado e zzzz é a hora onde foi executado.

Essa é uma forma de ver relações entre tabelas de diferentes ID mas que fizeram parte da mesma operação provocada pelo usuário.

Busca por exclusões

A pior busca que podemos fazer na tabela AUDITORIA é quando não sabemos o ID do registro que estamos buscando. Um exemplo é buscar itens que foram removidos de um pedido. Para isso precisamos descobrir as linhas em TRANSACAO_NEGOCIO_ITEM que foram removidas e que pertenciam a uma determinada TRANSACAO_NEGOCIO.

A query select * from AUDITORIA where TABELA = 'TRANSACAO_NEGOCIO_ITEM' and ACAO = 'DELETE' and OLD = xxxx onde xxxx é o ID do pedido ou transação de negócio que estamos avaliando seria a maneira de buscar os itens removidos. Contudo, não há nenhum índice útil para fazer esta query ser otimizada e ela acaba fazendo um full scan na tabela AUDITORIA por completo.