Pergunta

O tema de como tabelas de auditoria recentemente surgiram em nossas discussões ... então eu como sua opinião sobre o que é a melhor maneira de abordar esta questão. Temos uma mistura de ambas as abordagens (que não é bom) em nosso banco de dados, já que cada DBA anterior fez o que ele / ela acreditava que era o caminho certo. Então, precisamos mudá-los de seguir qualquer modelo um.

CREATE TABLE dbo.Sample(
Name VARCHAR(20),
...
...
Created_By VARCHAR(20),
Created_On DATETIME,
Modified_By VARCHAR(20),
Modified_On DATETIME
)

CREATE TABLE dbo.Audit_Sample(
Name VARCHAR(20),
...
...
Created_By VARCHAR(20),
Created_On DATETIME,
Modified_By VARCHAR(20),
Modified_On DATETIME
Audit_Type VARCHAR(1)  NOT NULL
Audited_Created_On DATETIME
Audit_Created_By VARCHAR(50)
)

Abordagem 1: Store, em tabelas de auditoria, somente os registros que são substituídos / excluídos da tabela principal (usando a tabela sistema excluído). Assim, para cada actualização e eliminar na tabela principal, a ficha que está a ser substituído é inserida na tabela de auditoria com coluna 'Audit_Type' como murchar 'U' (para UPDATE) ou 'D' (para APAGAR)

Insere não são auditados. Para a versão atual de qualquer registro que você sempre consultar a tabela principal. E para a história que você consulta tabela de auditoria.

Pros: Parece intuitivos, para armazenar as versões anteriores de registros Contras: Se você precisa saber a história de um registro particular, você precisa para se juntar a tabela de auditoria com mesa principal

.

appraoch. 2: Store, na tabela de auditoria, cada registro que vai para mesa principal (usando a tabela sistema inserido)

Cada registro que é inserido / updated / deleted à mesa principal também é armazenado na tabela de auditoria. Então, quando você inserir um novo registro também é inserido na tabela de auditoria. Quando atualizado, a nova versão (a partir inserido) tabela é armazenado na tabela de auditoria. Quando apagado, versão antiga (de DELETED) tabela é armazenado na tabela de auditoria.

Pros: Se você precisa saber a história de um registro específico, você tem tudo em um único local

.

Embora eu não listar todos eles aqui, cada abordagem tem seus prós e contras?

Foi útil?

Solução

Eu iria com:

appraoch 2: Store, na tabela de auditoria, cada registro que vai para mesa principal (Usando a tabela sistema inserido).

é mais uma linha por item realmente vai matar o DB? Desta forma, você tem o conjunto história completa.

Se você purgar linhas (uma gama todos mais velhos do que o dia X), você ainda pode dizer se algo mudou ou não:

  • se existe uma linha de auditoria (não purgado) você pode ver se a linha em questão alterado.
  • Se não existem linhas de auditoria para o item (todos foram purgados) nada mudou (uma vez que qualquer mudança grava na tabela de auditoria, incluindo completamente novos itens)

Se você vai com appraoch 1:. E limpar para fora um intervalo, será difícil (necessidade de lembrar a data purga) para contar novas inserções vs. aqueles em que todas as linhas foram expurgados

Outras dicas

Uma terceira abordagem que usamos um monte é auditar apenas as colunas interessantes e salvar ambos e valor 'novo' 'velho' em cada linha.

Então, se você tem a sua coluna "nome", a tabela de auditoria teria "name_old" e "name_new".

Em INSERIR gatilho "name_old" é definido como em branco / null dependendo da sua preferência e "name_new" é definido a partir inserido. Em gatilho UPDATE, "name_old" é definido a partir DELETED e "name_new" de INSERTED Em disparador de exclusão "name_old" é definido a partir DELETED e "new_name" em branco / null.

(ou você usar um full join e um gatilho para todos os casos)

Para campos VARCHAR, isso pode não parecer como uma boa idéia, mas para INTEGER, DATETIME, etc que oferece a vantagem de que é muito fácil de ver a diferença da atualização.

i. se você tem uma quantidade de campo em sua tabela real e atualizá-lo 5-7, você teria na tabela de auditoria:

quantity_old  quantity_new
           5             7

Facilmente você pode calcular que a quantidade foi aumentada por 2 no tempo específico.

Se você tem linhas separadas na tabela de auditoria, você terá que juntar uma linha com "o próximo" a diferença calcular - o que pode ser complicado em alguns casos ...

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top