Existe alguma maneira de determinar quem derrubou uma mesa?

8

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

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

Editar 1: Este é um aplicativo interno, com segurança fraca. Todos os aplicativos (exceto o meu ;-) são vulneráveis a SQL Injection, mas nossos usuários são muito pouco sofisticados e o nome da tabela não era imediatamente óbvio, então não acho foi uma Injeção de SQL (não que isso importe ... meio além do escopo da questão).

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

    
por John MacIntyre 16.06.2009 / 23:37

7 respostas

14

Você pode obter as informações do log usando a função undocumented :: fn_dblog que interpreta os registros de log. Eu estou no meio de ensinar uma aula de recuperação de desastres agora, mas se você puder esperar de 2 a 3 horas, postarei como fazer isso por você - será capaz de obter o nome de usuário também sem ter que comprar nenhuma ferramenta ( Eu usei spelunk ao redor do log a tonelada em 2000 como eu escrevi um monte de código de análise de log interno que DBCC CHECKDB usa em 2000).

[Editado para incluir instruções] Ok - terminou de ensinar e eu criei um post no blog para mostrar como analisar o log em 2000, 2005, 2008 para descobrir quando a tabela foi descartada e quem fez isso. Finalize minha postagem no blog em Finding quem derrubou uma tabela usando o log de transações . [/ edit]

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

Obrigado

PS Uma maneira de evitar quedas de tabelas em 2000 sem adicionar segurança é criar uma visualização simples de esquema - DROP TABLE falhará se a visualização existir.

    
por 17.06.2009 / 01:02
8

Talvez tenha sido o Little Bobby Tables ...

    
por 16.06.2009 / 23:41
2

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

    
por 16.06.2009 / 23:41
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 ser capaz de ver quando o objeto (tabela) foi descartado e por qual conexão o fez. Mas esse tipo de permissão deve ser dado somente aos DBA de qualquer maneira

    
por 16.06.2009 / 23:43
2

Estou tentando consertar um MSDB corrompido. Desculpe eu não sou capaz de elaborar.

Execute-os e ele deve fornecer uma ideia geral de onde procurar, supondo que seu rastreio padrão esteja ativado.

SELECT * FROM :: fn_trace_getinfo (padrão)

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

    
por 17.06.2009 / 00:12
2

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

Duas maneiras de fazer isso:

por 18.06.2013 / 10:55
2

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

Clique com o botão direito no relatório e no '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 o objeto ter sido descartado.

    
por 09.01.2014 / 06:50