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.
security
sql-server
John MacIntyre
fonte
fonte
Respostas:
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.
fonte
Talvez fosse Little Bobby Tables ...
fonte
Você pode recuperar essas informações fora dos logs SQL.
fonte
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
fonte
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
fonte
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:
fonte
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.
fonte