首页 > 代码库 > 谁把我的表给drop了?

谁把我的表给drop了?

今天生产上有人把几张表给DROP了,一通折腾。恢复备份导数回来数据,重建索引。

但是,我就想知道是谁给干掉了。

到你被删除表数据库中找日志吧。其它的也想不到更好办法了

 

USE ‘被删表数据库‘

--查年那些创建和删除表的用户和时间

SELECT
[Xact ID],Operation,[Transaction Id],SUSER_SNAME([Transaction SID]) [User],
[Transaction Name],[Begin Time],[SPID],Description
FROM fn_dblog (NULL, NULL)
WHERE [Transaction Name]= ‘DROPOBJ‘ or [Transaction Name]=‘CREATE TABLE‘

知道谁干的了。

等等,这只是知道它删除表了,能知道他删除那个表了吗?


SELECT [Lock Information] FROM fn_dblog (NULL, NULL)
WHERE
[Lock Information] LIKE ‘%SCH_M OBJECT%‘
and [Transaction Id]=‘0000:0000022d‘

结果:

Lock Information
HoBt 0:ACQUIRE_LOCK_SCH_M OBJECT: 12:2105058535:0

这个[Transaction Id]来自第一个查询中。上面标出结果中12是DBID,而后面的是objectid,由于表已经在数据库里删除了。我们没有办法通过object_name()来得到表名,所以只能拿着这个ID去恢复的数据库里找了。

或者可以通过其它的方法:

如果你的‘default trace enabled’是默认设置,那就有好办法了。

通过下面的语句确认是否启动:

select * from sys.configurations
where name = ‘default trace enabled‘

如果是启用的,OK,我们可以使用下面查询

SELECT SessionLoginName,LoginName,SPID,StartTime,ObjectID,ObjectName ,TransactionID
FROM fn_trace_gettable
(‘D:\Program Files\Microsoft SQL Server\MSSQL10.SQL2K8\MSSQL\Log\log_8.trc‘, default)
where DatabaseName=‘Test‘

其中的那个trc文件在你的系统安装路径里,例如我的

按修改日期排序,找出最新一个。一般是LOG日志数字比较大的那个,我的是log_8.trc。

好了,我们看看上面的查询返回的结果

 

看到了吧,上面的TransactionID列的值正好与我们第一个查询中[Xact ID]值对上了。这样我们就能确认什么人在什么时间删除了什么表了。

其实,SQL SERVER已经具有这个功能。

 Reports > Standard Reports > Schema Changed History

 

 

这里有一个条件是你的数据库是full恢复模式,你的日志没有被断了。是否可能从已经备份的事务日志里找呢?也是可以的,下次我们一起研究一下吧~~

参考

http://www.sqlskills.com/blogs/paul/finding-out-who-dropped-a-table-using-the-transaction-log/

http://sqlserver-help.com/2011/06/08/help-who-dropped-objects-from-database/

http://msdn.microsoft.com/en-us/library/ms175513.aspx?s=1

谁把我的表给drop了?