melhor maneira de implementar uma trilha de auditoria no sql-server?

Eu não sei se esses requisitos são padrão ou não, mas eu me pergunto se há uma solução lá fora, que pode fazer o seguinte:

  • Para um conjunto especificado de tabelas, mantenha uma cópia de um registro antes de alterá-lo em uma versão de auditoria da tabela relevante.

Eu prefiro não ter código para cada tabela. Eu estou querendo saber se existe uma solução que você pode instalar em cima do ms-sql, que vai fazer isso por você?

Existem muitas maneiras de fazer isso, depende de qual versão do sql server você está usando.

Aqui estão alguns

  • trilha de auditoria com tabela de sombra e gatilho. Aqui está o link

  • Você também pode considerar usar o recurso de auditoria do SQL Server 2008. Aqui está o link

Espero que ajude.

Você pode experimentar uma solução baseada em gatilho de apontar e clicar de terceiros, como ApexSQL Audit – uma ferramenta de auditoria para bancos de dados do SQL Server, que captura alterações de dados que ocorreram em um database, incluindo as informações sobre quem fez a alteração afetada, quando ela foi feita, bem como as informações sobre o login, aplicativo e host do SQL usados ​​para fazer a alteração. Ele armazena todas as informações capturadas em um repository central e as exporta em formatos amigáveis ​​para impressão

Disclaimer: Eu trabalho como Engenheiro de Suporte ao Produto na ApexSQL

Eu crio gatilho que faz isso para XML assim podemos registrar todas as tabelas na mesma tabela, tornando-a mais flexível

CREATE TABLE [dbo].[AuditAll] ( AuditId int NOT NULL IDENTITY(1,1), [DateTime] datetime NOT NULL, TableName nvarchar(255) NOT NULL, AuditEntry xml NULL, CONSTRAINT [PK_AuditAll] PRIMARY KEY CLUSTERED ( AuditId ASC ) ) 

Eu precisava apenas de valores ‘antigos’, então eu armazeno apenas a tabela excluída, a tabela inserida pode ser vista na tabela de qualquer forma.

 CREATE TRIGGER AuditSimple ON Simple AFTER INSERT,DELETE,UPDATE AS BEGIN -- SET NOCOUNT ON added to prevent extra result sets from -- interfering with SELECT statements. SET NOCOUNT ON; IF (SELECT COUNT(*) FROM deleted) > 0 begin Declare @AuditMessage XML --set valut to all xml from deleted table set @AuditMessage = (select * from deleted for xml auto) insert into AuditAll( DateTime, TableName, AuditEntry ) values ( GetDate(), 'Simple', @AuditMessage ) end END GO 

Eu acho que isso poderia ser facilmente chamado em sp_foreach para criá-lo para cada tabela no database, mas nós não precisávamos no momento, apenas lembre-se de alterar os nomes das tabelas

Felicidades

Dê uma olhada nos gatilhos. Estes podem ser usados ​​para implementar algo para atender às suas necessidades.

Dê uma olhada neste artigo – Auditoria no SQL Server 2008, que aproveita os resources de auditoria já presentes no SQL Server 2008.

Também devo mencionar que o @Microtechie responde a alguns ótimos artigos. Leia-os e decida qual deles é mais fácil de adaptar.

Com os Snapshots do database, você pode manter uma cópia somente leitura de seus dados nesse instante. Além disso, com seus backups dos registros, você pode restaurar suas informações em um período de tempo específico, se necessário.

Você também pode ler informações do log para recuperar as informações alteradas.

A outra solução que não é da sua preferência é rastrear as alterações usando gatilhos, mas pode ser necessário trabalhar em cada tabela. Você também pode ativar o recurso Change Data Capture para detectar alterações, esse recurso também precisa ser ativado para cada tabela, mas requer menos código que os gatilhos.

Finalmente, existem ferramentas de terceiros, como o Apex SQL Trigger, que fazem esse trabalho automaticamente com poucos cliques e configurações.