SQL Server Default Trace查看是谁对数据库进行了DDL操作
在我们的工作中可能会遇到这样一种情形。由于数据库中某些对象被altered/created/deleted,造成我们的应用程序crash。
当我们把问题解决之后,老板可能会问发生了什么?为什么会这样?是谁干的?
在SQL Server 2005中提供了DDL trigger,它能回答所用这些问题,但我们没有在事前实现这一工作。
在这种情况下,有些人可能会对老板说:“我不知道,但我能去查。”之后就疯狂地寻找第三方的工具来读transaction log(事物日志)。他们可能不知道SQL Server 2005有一个内置的功能能回到所用这些问题。
答案藏在一个运行在后台的跟踪(Default Trace)中,我们可以利用Default Trace来寻找排除故障。Default Trace默认会自动运行,因为其非常轻量级,所以不会给系统造成很多负担。对我来说,Default Trace所带来的益处远大于它给数据库带来的负担。Default Trace不能代替DDL trigger的功能,它应被用作SQL实例的监视器,或用来快速获得SQL问题事件的详细信息。
Default Trace不会跟踪所有的事件,它扑捉一些关键性信息,包括auditing events,database events,error events,full text events,object creation,object deletion,object alteration。在本文中我们会关注对象级(event level)的事件,这能回答老板的“是谁干的”这一问题。
下面的代码能查询Default Trace是否已经被开启了
select * from sys.configurations where configuration_id = 1568
如果Default Trace功能没有打开,我们先要打开这个Trace。可以是使用如下代码,注意运行这些代码需要相应的权限。
sp_configure 'show advanced options', 1;
go
reconfigure;
go
sp_configure 'default trace enabled', 1;
go
reconfigure;
go
下一段代码是来获取当前跟踪文件的路径。在相应的文件夹下可能会有多个以log_开头的trace文件,我们可以把这些文件载入一个表中,进行分析,但载入多个文件会增加开销。最好只是载入需要分析的信息。
select * from ::fn_trace_getinfo(0)
现在让我们看一看跟踪下来的数据。我们先从创建一个新数据库开始。
use master
go
create database TraceDB
使用如下的代码来打开跟踪文件,获取创建数据库的信息。这里使用了一些限制性的条件来缩小结果集。
注意:你的跟踪文件路径和名称可能和我的不同。要使用你自己的跟踪路径。
select
loginname,
loginsid,
spid,
hostname,
applicationname,
servername,
databasename,
objectname,
e.category_id,
cat.name as [CategoryName],
textdata,
starttime,
eventclass,
eventsubclass, --0表示begin,1表示commit
e.name as EventName
from ::fn_trace_gettable('C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\LOG\log.trc',0)
inner join sys.trace_events e
on eventclass = trace_event_id
inner join sys.trace_categories as cat
on e.category_id = cat.category_id
where databasename = 'TraceDB' and
objectname is null and --根据objectname来过滤
e.category_id = 5 and --category 5表示对象
e.trace_event_id = 46 --trace_event_id: 46表示Create对象,47表示Drop对象,164表示修改对象
你能看到超过一条的结果,这是因为捕捉到了2事件子类,begin和commit。
现在创建另一个对象并再次进行查询。这次我们创建一张表“MyTable”。
use TraceDB
go
create table dbo.MyTable(
id int identity(1,1) not null,
sometext char(3) null
) on primary
现在使用类似的脚本来查询Default Trace,对where条件部分进行修改。
where databasename = 'TraceDB' and
objectname = 'MyTable' and
e.category_id = 5 and
e.trace_event_id = 46
我们同样可以修改对象,代码如下:
use TraceDB
go
alter table MyTable
add col int
使用如下的条件来过滤查询,特别注意修改trace_event_id为164,因为164代表对象修改事件
where databasename = 'TraceDB' and
objectname = 'MyTable' and
e.category_id = 5 and
e.trace_event_id = 164
最后我们可以把"MyTable"Drop掉。
use TraceDB
go
drop table MyTable
使用如下的条件来过滤查询,注意修改trace_event_id为47,因为47代表对象删除事件
where databasename = 'TraceDB' and
objectname = 'MyTable' and
e.category_id = 5 and
e.trace_event_id = 47
SQL Server Default Trace查看是谁对数据库进行了DDL操作的更多相关文章
- SQL Server误删表查看
SQL Server误删表查看 转自:http://blog.51cto.com/aimax/2134572 SQL Server 完全恢复模式 下恢复误删除的表,进行 精准 恢复 1. 找出被 ...
- SQL Server 用SSMS查看依赖关系有时候不准确,改用代码查
SQL Server 用SSMS查看依赖关系有时候不准确,明明某个sp中有用到表tohen,查看表tohen的依赖关系的时候,却看不到这个sp 用代码查看方式如下: --依赖于表tohen的对象 SE ...
- sql server中如何查看执行效率不高的语句
sql server中,如果想知道有哪些语句是执行效率不高的,应该如何查看呢?下面就将为您介绍sql server中如何查看执行效率不高的语句,供您参考. 在测量功能时,先以下命令清除sql se ...
- [SQL] sql server中如何查看执行效率不高的语句
sql server中,如果想知道有哪些语句是执行效率不高的,应该如何查看呢?下面就将为您介绍sql server中如何查看执行效率不高的语句,供您参考.在测量功能时,先以下命令清除sql serve ...
- SQL Server 表的管理_关于数据增删查改的操作的详解(案例代码)
SQL Server 表的管理_关于数据增删查改的操作的详解(案例代码)-DML 1.SQL INSERT INTO 语句(在表中插入) INSERT INTO 语句用于向表中插入新记录. SQL I ...
- sql server登录名、服务器角色、数据库用户、数据库角色、架构区别联系
原创链接:https://www.cnblogs.com/lxf1117/p/6762315.html sql server登录名.服务器角色.数据库用户.数据库角色.架构区别联系 1.一个数据库用户 ...
- 【转】SQL Server、Oracle、MySQL和Vertica数据库常用函数对比
SQL Server.Oracle.MySQL和Vertica数据库常用函数对比 Vertica数据库是HP公司新收购的用于BI方面的数据库. 1. 绝对值 S:select abs(-1) valu ...
- 使用SQL Server 2008的事务日志传送功能备份数据库(logshiping)
使用SQL Server 2008的事务日志传送功能备份数据库(logshiping) 使用SQL Server 2008的事务日志传送功能备份数据库(logshiping)
- 利用SQL Server Management Studio(SSMS)复制数据库
利用SQL Server Management Studio(SSMS)复制数据库 标签(空格分隔): SQLServer 前言 今天由于客户购买的软件版本确认了,而之前进行开发的本地数据库版本较低, ...
随机推荐
- jQuery的基础总结
**本篇只列出零碎的jQuery基础知识点,个人记录自己的学习进度,无序排列,谨慎查看.** 1.jQuery入口函数的四种写法2.jQuery与JS遍历数组的区别3.jQuery符号冲突问题4.jQ ...
- 下载安装GO,编辑器GOLand和在GOLand上运行项目的几种方式
下载安装GO 下载GO地址:https://golang.google.cn/dl/,一直下一步下一步的操作. 安装完成之后,会有一个GOPATH(此路径是创建go项目的时候会自动在该文件夹下创建), ...
- Windows的socket编程
################服务端 1.准备工作导入头文件 #include<WinSock2.h> #pragma comment(lib, "ws2_32.lib&quo ...
- 视图集ViewSet
一 .视图集ViewSet 使用视图集ViewSet,可以将一系列逻辑相关的动作放到一个类中: list() 提供一组数据 retrieve() 提供单个数据 create() 创建数据 update ...
- 使用PHP开发HR系统(4)
本节我们讲述如何引入页面框架来建立漂亮的主页. ============================================================================ ...
- vue 项目之后生成的 dist 文件该怎么在本地启动运行
简单高效 npm i -g servecd distserve
- 前端开发 Vue Vue.js和Nodejs的关系
首先vue.js 是库,不是框架,不是框架,不是框架. Vue.js 使用了基于 HTML 的模版语法,允许开发者声明式地将 DOM 绑定至底层 Vue 实例的数据. Vue.js 的核心是一个允许你 ...
- 忽略警告@SuppressWarnings的用法
@SuppressWarnings注解用法 @SuppressWarnings注解主要用在取消一些编译器产生的警告对代码左侧行列的遮挡,有时候这会挡住我们断点调试时打的断点. 我们可以在方法上加上@S ...
- 使nginx支持pathinfo模式
在将fastadmin部署到虚拟机中时,遇到如下问题:当访问登录页面时,页面进行不断的循环跳转重定向.解决方法是将nginx配置为支持pathinfo的模式 以下是nginx中的配置内容: locat ...
- urlib库
urllib库是python中最基本的网络请求库,可以模拟浏览器的行为,向指定的服务器发送请求,并可以保存服务器返回的数据. urlopen() urllib.request模块提供了最基本的构造ht ...