Existe alguma maneira de determinar quem deixou cair uma mesa?


8

Uma tabela no banco de dados de produção desapareceu 'misteriosamente'.

Alguém sabe alguma maneira de diagnosticar o que diabos aconteceu com isso? E quem fez isso?

Editar 1: este é um aplicativo interno, com pouca segurança. Todos os aplicativos (exceto o meu, é claro ;-) são vulneráveis ​​à injeção de SQL, mas nossos usuários são muito pouco sofisticados e o nome da tabela não era aquele que poderia ser imediatamente óbvio, por isso não acho que fosse uma injeção de SQL (não que isso importa ... meio que está além do escopo da questão).

Edit 2: Além disso, apenas um FYI; esta tabela existe há muito tempo, portanto não foi 'desfeita' com uma restauração.


Você quer dizer que o fantasma "Eu não" também te pegou?
Nick DeVore

você tem contas de banco de dados separadas para todos ou todos fazem login como 'dba' ou algo equivalente?

@ Zerofiz - Estamos usando o Windows Integrated Security, então sim, todos os usuários podem ser identificados.
John MacIntyre

Me deparei com este blog, que explica o processo passo a passo para determinar quem eliminou a tabela dbarepublic.com/2015/01/who-dropped-table.html .

Respostas:


14

Você poderá obter as informações do log usando a função indocumented :: fn_dblog, que interpreta os registros de log. Estou no meio de uma aula de recuperação de desastre agora, mas se você puder esperar de duas a três horas, postarei como fazer isso por você - também será possível obter o nome de usuário sem precisar comprar nenhuma ferramenta ( Eu costumava escrever em torno do log uma tonelada em 2000, enquanto escrevia vários códigos de análise de logs internos que o DBCC CHECKDB usa em 2000).

[Editado para incluir instruções] Ok - terminei o ensino e eu escrevi uma postagem no blog para mostrar como analisar o log em 2000, 2005, 2008 para descobrir quando a tabela foi descartada e quem o fez. Confira minha postagem no blog em Descobrindo quem deixou cair uma tabela usando o log de transações . [/editar]

Você ainda tem o log de transações por aí? Em qual modelo de recuperação está o banco de dados? Se for SIMPLES, não faça nada que possa causar um ponto de verificação. Se estiver COMPLETO ou BULK_LOGGED, não faça um backup do log. Qualquer uma dessas opções fará com que o log seja truncado e você poderá perder a capacidade de olhar para trás, embora eu tenha incluído um sinalizador de rastreamento na postagem do blog que também pode ajudá-lo.

obrigado

PS Uma maneira de impedir que as tabelas caiam em 2000 sem adicionar segurança é criar uma exibição simples de esquema - DROP TABLE falhará se a exibição existir.


Obrigado Paul, esse é um ótimo conselho. Eu posso esperar. Estou saindo agora e indo para outro cliente amanhã, então tentarei descobrir o que aconteceu na quinta-feira. Vou informar o administrador sobre o backup do log.
John MacIntyre

8

Talvez fosse Little Bobby Tables ...


11
Agradável :) faria +1 por humor, mas isso seria bobagem, pois a única outra resposta tem 1 voto também.

2
Não, isso é engraçado o suficiente para um voto positivo.
Electrons_Ahoy

2

Você pode recuperar essas informações fora dos logs SQL.


Eu sei que essas informações estão nos logs do SQLServer, mas achei que você não conseguiria ler nada deles. Eu adoraria descobrir que você pode. Alguém sabe?
John MacIntyre

IM apenas familiarizado com Sybase SQL Anywhere, mas eles têm um utilitário para traduzir arquivos de log em instruções SQL ...

11
Essa ferramenta pode ajudá-lo a ler os logs. red-gate.com/products/SQL_Log_Rescue/index.htm
RSolberg 16/06/2009

+1 para o link da ferramenta de log. Por que você não coloca na resposta?
John MacIntyre

2

Se o log de rastreamento padrão estiver em execução, todas as informações serão armazenadas na pasta de log. Você deve poder ver quando o objeto (tabela) foi descartado e por qual conexão o fez. Mas esse tipo de permissão só deve ser concedido aos DBAs de qualquer maneira


2

Estou tentando corrigir um MSDB corrompido. Desculpe, não sou capaz de elaborar.

Execute-os e deve dar uma idéia geral de onde procurar, assumindo que o rastreio padrão esteja ativado.

SELECT * FROM :: fn_trace_getinfo (padrão)

SELECT t.EventID, t.ColumnID, e.name como Event_Description, c.name como Column_Description FROM :: fn_trace_geteventinfo (1) t JOIN sys.trace_events e ON t.eventID = e.trace_event_id JOIN sys.trace_columns c ON t.columnid = c.trace_column_id


Obrigado, acho que as tabelas sys. * São de 2005, mas não são? Existe um equivalente a 2000?
John MacIntyre

2

A única maneira de descobrir essas informações é lendo o log de transações (supondo que esteja no modo de recuperação total).

Duas maneiras de fazer isso:

  • Ferramentas de terceiros, como ApexSQL Log ou SQL Log Rescue (gratuito, mas somente sql 2000)
  • Usando comandos como DBCC LOG ou fn_dblog - nenhum dos quais está bem documentado, infelizmente

2

No SSMS, você pode tentar clicar com o botão direito do mouse no dB e navegar por Relatórios -> Relatórios padrão -> Histórico de alterações de esquema.

Clique com o botão direito do mouse no relatório e em 'SaveAs' Excel e encontre o nome do seu objeto.

Você não poderá obter nada se o servidor tiver sido reiniciado mais de cinco vezes após a queda do objeto.


Olhando para os logs falhou para mim. A maioria foi superada devido ao alto número de transações em nosso sistema. Seu método funcionou perfeitamente. Obrigado por compartilhar!
tylerjgarland
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.