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 OBJETO
acontece 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.