Meu chefe teve uma consulta de um cliente ontem perguntando como eles poderiam descobrir quem excluiu alguns dados em seu banco de dados SQL Server (é a edição expressa, se isso importa).
Eu pensei que isso poderia ser encontrado no log de transações (desde que não tivesse sido truncado) - isso está correto? E se sim, como você realmente vai encontrar essas informações?
Eu não tentei fn_dblog no Express, mas se estiver disponível, o seguinte fornecerá operações de exclusão:
Pegue o ID da transação para transações em que você está interessado e identifique o SID que iniciou a transação com:
Em seguida, identifique o usuário do SID:
Edit: Juntando tudo isso para encontrar exclusões em uma tabela especificada:
Se o banco de dados estiver no modo de recuperação total ou se você tiver backups de log de transações, tente lê-los usando leitores de log de terceiros.
Você pode experimentar o ApexSQL Log (premium, mas tem uma avaliação gratuita) ou SQL Log Rescue (gratuito, mas apenas sql 2000).
Embora isso seja respondido, queria acrescentar que o SQL Server tem um rastreamento padrão habilitado e pode ser usado para descobrir quem derrubou/alterou os objetos.
Eventos de objetos
Os eventos de objeto incluem: Objeto Alterado, Objeto Criado e Objeto Excluído
observação: o SQL Server por padrão tem 5 arquivos de rastreamento, 20 MB cada e não há nenhum método conhecido com suporte para alterar isso. Se você tiver um sistema ocupado, os arquivos de rastreamento podem rolar muito rápido (mesmo dentro de horas) e você pode não conseguir capturar algumas das alterações.
Excelente exemplo pode ser encontrado: O rastreamento padrão no SQL Server - o poder da auditoria de desempenho e segurança
Você pode tentar este procedimento para consultar os arquivos de backup de log e descobrir em qual(is) arquivo(s) de backup de log um valor específico de uma coluna de uma tabela ainda estava presente/último.
Para localizar o usuário, após localizar em qual backup de log o valor existia pela última vez, você pode restaurar um banco de dados até esse backup de log e, em seguida, seguir a resposta de Mark Storey-Smith .
Alguns pré-requisitos
Isenção de responsabilidade
Esta solução está longe de ser à prova d'água, e muito mais trabalho precisa ser feito.
Ele não foi testado em ambientes de grande escala, ou mesmo em qualquer ambiente além de alguns pequenos testes. A execução atual foi no SQL Server 2017.
Você pode usar o procedimento abaixo de Muhammad Imran que modifiquei para trabalhar com o conteúdo dos backups de log em vez do conteúdo do log de um banco de dados ativo.
Dessa forma, você tecnicamente não está fazendo restaurações, mas despejando o conteúdo do log em uma tabela temporária. Provavelmente ainda será lento e está muito aberto a bugs e problemas. Mas poderia funcionar, em teoria™.
O procedimento armazenado usa a
fn_dump_dblog
função não documentada para ler os arquivos de log.Ambiente de teste
Considere este banco de dados, onde inserimos algumas linhas, fazemos 2 backups de log e, no terceiro backup de log, excluímos todas as linhas.
O procedimento
Você pode encontrar e baixar o procedimento armazenado aqui .
Eu não poderia adicioná-lo aqui, pois é maior que o limite de caracteres e tornaria essa resposta ainda menos clara do que é.
Além disso, você deve ser capaz de executar o procedimento.
Executando o procedimento
Um exemplo disso, quando adiciono todos os meus arquivos de log (
4
) ao procedimento armazenado e executo o procedimento procurando por valor1Isso me pega:
Onde podemos encontrar quando foi a última vez que uma operação
value1
aconteceu, a exclusão emlog3.trn
.Mais alguns dados de teste, adicionando uma tabela com colunas diferentes
Alterando os nomes dos arquivos de log e executando o procedimento novamente
Resultado
Uma nova execução, procurando o inteiro (
2
) naval3
coluna dedbo.WrongDeletes2
Resultado
Aplicando a resposta de Mark Storey-Smith
Sabemos agora que aconteceu no terceiro arquivo de log, vamos restaurar até esse ponto:
Executando a última consulta em sua resposta
Resultado para mim (sysadmin)