Ontem, meu chefe teve uma consulta de um cliente perguntando como eles poderiam descobrir quem excluiu alguns dados do banco de dados do 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 descobre essas informações?
sql-server
transaction
delete
audit
Matt Wilko
fonte
fonte
fn_dblog
. Uma desvantagem é que ele retorna o banco de dados,USERNAME()
e não o nome de login muito mais útil.Se o banco de dados estiver no modo de recuperação completa 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 o SQL Log Rescue (gratuito, mas apenas o sql 2000).
fonte
Embora isso seja respondido, você deseja adicionar que o SQL Server tem um rastreamento padrão ativado e pode ser usado para descobrir quem descartou / alterou os objetos.
Eventos de objeto
Os eventos de objeto incluem: Objeto alterado, Objeto criado e Objeto excluído
nota: o SQL Server, por padrão, possui 5 arquivos de rastreamento, 20 MB cada e não há um método suportado conhecido para alterar isso. Se você possui um sistema ocupado, os arquivos de rastreamento podem ser transferidos rapidamente demais (mesmo em algumas horas) e talvez não seja possível detectar algumas das alterações.
Exemplo excelente pode ser encontrado: O rastreamento padrão no SQL Server - o poder da auditoria de desempenho e segurança
fonte
Você pode tentar este procedimento para consultar os arquivos de backup de log e encontrar em quais arquivos de backup de log um valor específico de uma coluna de uma tabela ainda estava / último presente.
Para encontrar o usuário, depois de encontrar em qual backup de log o valor existia pela última vez, você pode restaurar um banco de dados até esse backup de log e seguir a resposta de Mark Storey-Smith .
Alguns pré-requisitos
aviso Legal
Esta solução está longe de ser à prova d'água e é necessário muito mais trabalho.
Não foi testado em ambientes de grande escala, nem em ambientes que não sejam alguns testes pequenos. A execução atual foi no SQL Server 2017.
Você pode usar o procedimento abaixo de Muhammad Imran, que eu 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, tecnicamente, você não está fazendo restaurações, mas descartando 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, 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 poder 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 valor1Isso me deixa:
Onde podemos encontrar a última vez que uma operação
value1
ocorreu, a exclusão delog3.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 número inteiro (
2
) naval3
coluna dedbo.WrongDeletes2
Resultado
Aplicando a resposta de Mark Storey-Smith
Sabemos agora que isso aconteceu no terceiro arquivo de log, vamos restaurar até esse ponto:
Executando a última consulta em sua resposta
Resultado para mim (sysadmin)
fonte