无论如何确定谁丢下了一张桌子?

生产数据库中的表格“神秘地”消失了。

有没有人知道有什么方法来诊断它发生了什么? 谁做的?

编辑1:这是一个内部的应用程序,安全性较差。 所有的应用程序(除了我的当然;-)是容易受到SQL注入,但我们的用户是非常古板和表名不是一个可能立即明显,所以我不认为这是一个SQL注入(不这很重要…超出了问题的范围)。

编辑2:另外,只是一个FYI; 这张桌子已经存在很长时间了,所以还没有“恢复”。

您可以使用解释日志logging的未公开的:: fn_dblog函数从日志中获取信息。 我现在正在教授灾难恢复课程,但是如果你可以等2-3个小时,我会发布如何为你做 – 也应该能够获得用户名,而不必购买任何工具( 2000年,我曾经在2000年的日志里面写过一些关于DBCC CHECKDB使用的内部日志分析代码)。

[编辑包括说明]好吧 – 完成教学,我敲了一篇博文,告诉你如何分析2000年,2005年,2008年的日志,以找出什么时候表被删除,谁做的。 查看我的博客文章查找谁使用事务日志删除了一个表 。 [/编辑]

你还有交易日志吗? 数据库中有哪些恢复模式? 如果是简单的,不要做任何会导致检查点的事情。 如果它是全部或大容量日志,请不要做日志备份。 这些都会导致日志被截断,然后你可能会失去回头看日志的能力,尽pipe我在博客文章中包含了一个跟踪标志,可以帮助你。

谢谢

PS在不增加安全性的情况下,在2000年防止表丢弃的一种方法是在其上创build一个简单的模式绑定视图 – 如果视图存在,DROP TABLE将失败。

也许这是小鲍比表…

您可能能够从SQL日志中恢复这些信息。

如果默认跟踪日志正在运行,则所有信息都存储在日志文件夹中。 您应该能够看到对象(表)何时被丢弃以及通过哪个连接进行操作。 但是这种types的权限应该只给予DBA

我正在修复一个损坏的MSDB。 对不起,我无法详细说明。

运行这些,它应该给出一个大致的想法在哪里看,假设你的默认跟踪打开。

SELECT * FROM :: fn_trace_getinfo(默认)

SELECT t.EventID,t.ColumnID,e.name as Event_Description,c.name as 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

在SSMS中,您可以尝试右键单击dB并浏览报告 – >标准报告 – >架构更改历史logging。

右键单击报告和“SaveAs”Excel,find您的对象namne。

如果服务器在对象被删除后重新启动超过五次,您将无法获得任何内容。

只有通过读取事务日志(假设它处于完全恢复模式)才能find此信息。

两种方法来做到这一点:

  • 第三方工具,如ApexSQL日志或SQL日志救援 (免费但SQL 2000只)
  • 使用诸如DBCC LOG或fn_dblog之类的命令 – 不幸的是这些命令都没有很好的logging