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.
