今天生产上有人把几张表给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了?的更多相关文章

  1. sql语句中----删除表数据drop、truncate和delete的用法

    sql语句中----删除表数据drop.truncate和delete的用法 --drop drop table  tb   --tb表示数据表的名字,下同 删除内容和定义,释放空间.简单来说就是把整 ...

  2. 2019.6.13_SQL语句中----删除表数据drop、truncate和delete的用法

    一.SQL中的语法 1.drop table 表名称                         eg: drop table  dbo.Sys_Test   2.truncate table 表 ...

  3. 删除表数据drop、truncate和delete的用法

    说到删除表数据的关键字,大家记得最多的可能就是delete了 然而我们做数据库开发,读取数据库数据.对另外的两兄弟用得就比较少了 现在来介绍另外两个兄弟,都是删除表数据的,其实也是很容易理解的 老大- ...

  4. Oracle数据表被drop后的恢复

    对于被drop的表和索引,都会存放在回收站中(所以对于生产的数据库必须设置好回收站功能) 由于本次生成环境在drop掉已有的表后,又一次创建了很多的表,全部直接还原的话会提示原有对象存在,表名反复.当 ...

  5. mysql语句中----删除表数据drop、truncate和delete的用法

    程度从强到弱 1.drop  table tb        drop将表格直接删除,没有办法找回 2.truncate (table) tb       删除表中的所有数据,不能与where一起使用 ...

  6. mysql----快速删除数据表(drop,truncate.delete)

    概念: 三者均可删除数据表 TRUNCATE TABLE 在功能上与不带 WHERE 子句的 DELETE 语句相同:二者均删除表中的全部行.但 TRUNCATE TABLE 比 DELETE 速度快 ...

  7. 数据库之删除表数据drop、truncate和delete的用法

    数据库中删除表数据的关键字,最常用的可能就是delete了,另外其实还有drop和truncate两个关键字. 老大:drop 命令格式:drop table  tb  ---tb表示数据表的名字,下 ...

  8. mysql:删除表数据drop、truncate和delete的用法

    程度从强到弱 1.drop  table tb        drop将表格直接删除,没有办法找回 2.truncate (table) tb       删除表中的所有数据,不能与where一起使用 ...

  9. oracle中删除表:drop、delete、truncate

    相同点,使用drop delete truncate 都会删除表中的内容 drop table 表名 delete from 表名(后面不跟where语句,则删除表中所有的数据) truncate t ...

随机推荐

  1. 虚拟机centos笔记整理,持续更新~~

    远程拷贝文件:scp -r 文件名 主机名:完整路径名(冒号不能少)拷贝当前windows系统的文件到当前目录:rz -y 查找文件:updatedb 修改数据库locate 文件名 即可查找文件

  2. php对图片加水印--将一张图片作为水印加到另一张图片

    代码如下: /**  * 图片加水印(适用于png/jpg/gif格式)  *  * @param $srcImg  原图片  * @param $waterImg 水印图片  * @param $s ...

  3. 十三、nginx 强制下载txt等文件

    当前的浏览器能够识别文件格式,如果浏览器本身能够解析就会默认打开,如果不能解析就会下载该文件. 那么使用nginx做资源服务器的时候,如何强制下载文件呢? location /back/upload/ ...

  4. Python基础学习总结(六)

    8.函数 函数是带名字的代码块,用于完成具体的工作.def函数定义,指出函数名.定义函数的时候,我们把参数的名字和位置确定下来,函数的接口定义就完成了.对于函数的调用者来说,只需要知道如何传递正确的参 ...

  5. java四大特性详解

    Java的四大基础特性一.抽象 父类为子类提供一些属性和行为,子类根据业务需求实现具体的行为. 抽象类使用abstract进行修饰,子类要实现所有的父类抽象方法否则子类也是抽象类.二.封装 把对象的属 ...

  6. Hive Join

    最近被朋友问到有关于Hive Join的问题,保守回答过后,来补充补充知识: Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供类SQL查询功能. 一.Hi ...

  7. java下double相乘精度丢失问题

    比如 System.out.println(0.14*100); 输出: 14.000000000000002 解决方法: BigDecimal b = new BigDecimal(String.v ...

  8. Effective C++ .12 复制对象-拷贝构造函数的编写

    当我们自己编写拷贝构造函数时,编译器就不会为该类生成默认拷贝构造函数了,对于assignment operator也是如此. 1. 拷贝构造函数中记得调用父类的拷贝构造函数,或者相应复制过程 clas ...

  9. Python入门-类的成员

    昨天我们简单的认识了一下面向对象,以及和面向过程之间的区别,从而我们知道了类这个东西,今天我们就来详细的了解一下关于类的一些东西. 一.类的成员 首先, 什么是类的成员,很简单, 你能在类中写什么? ...

  10. lua中使用table实现类和继承

    --因为只有当读写不存在的域时,才会触发__index和__newindex classA = {className = "classA",name="classAIns ...