如何跟踪检查数据库中对象的改动

     一些时候,我们发现数据库中的一些对象(object)发生了改动,如表结构发生了改动(有Create/Alter/Delete操作)引发了应用程序出错,这时候Boss就会发问,为什么会发生这样错误,原因何在,到底是谁的责任。作为一名SQL Server数据库DBA,针对这个,我们要尽快查明结构被改动的对象,改动时间,操作人或PC等。

      在SQL Server 2005 中,通过读取默认跟踪日志文件,查询出最近哪些结构被改动,为我们找出问题的根源。接下来,就介绍如何通过读取默认跟踪日志文件。

default trace enabled 选项


       在SQL Server中,使用”default trace enabled” 选项,来启用或禁用默认跟踪日志文件。在系统默认情况下,”default trace enabled” 选项值为1,也就是默认启用。我们在Microsoft SQL Server Management Studio(MSSMS)查询中,可以通过下面Select语句查询其状态:

 
Select * From sys.configurations Where configuration_id = 1568

image
要是我们想设置“default trace enabled”选项,必须先要启用“show advanced options”选项。
use master
Go
sp_configure 'show advanced options', 1
Go
Reconfigure
Go
sp_configure 'default trace enabled', 1
Go
Reconfigure
Go
 

fn_trace_gettable系统函数


      确认启用默认跟踪日志文件后,我们就要如何读取默认跟踪日志文件。SQL Server为我们提供了系统函数fn_trace_gettable,来读取根据这日志文件。
 
use master
Go
Declare @Filename nvarchar(256),
@Index int
Set @Filename=(Select path From sys.traces Where is_default=1)
Set @Index=Patindex('%\%',Reverse(@Filename))
Set @Filename=Substring(@Filename,1,len(@Filename)-@Index)+'\Log.trc'

Select HostName,
ApplicationName,
LoginName,
StartTime,
ServerName,
ObjectName,
ObjectType,
DatabaseName,
Case EventClass
When 46 Then N'Create'
When 47 Then N'Drop'
When 164 Then N'Alter'
End As ddl_operation
From fn_trace_gettable(@Filename,0)
where EventClass in (46,47,164)
And EventSubclass = 0
And DatabaseID <> 2
And objecttype Not In (21587)
Go

上面的T-SQL语句,查询了对象的结构有改动的历史记录,根据实际的环境,可加更多的过滤条件来筛选返回的行,以满足我们的需要。
image
这里对T-SQL语句的条件中,用到的一些列做个简单的说明:

列名

说明

EventClass

46: Create Object

47: Drop Object

164: Alter Object

DatabaseID 2: 临时数据库tempDB
objecttype 21587:统计信息的对象类型,格式如,”_WA_Sys_Contact_186270A4”
EventSubclass

0:Begin

1:Commit

 
要了解系统函数fn_trace_gettable(),返回记录集合中有关其他列的更多说明,可以参考系统存储过程sp_trace_setevent。以下列出与这里相关的,有关Trace的几个系统的目录视图:
Select * From sys.traces

image

用于查询当前的跟踪(Trace),其中列is_default描述为是否默认跟踪。在前面的T-SQL代码中有应用到。

Select * From sys.trace_categories

image

用于查询跟踪中,事件的类别。另外还有3个目录视图:

Select * From sys.trace_columns
Select * From sys.trace_event_bindings
Select * From sys.trace_subclass_values

image

分別描述跟踪的事件列、事件与跟踪咧的关系,和具体的跟踪项。

.

其他跟踪方法


跟踪数据库中对象的结构改动,在SQL Server中另外有两种方法可以实现。

第一种,在MSSMS界面中,通过SQL Server 提供的标准报表查阅结构的变化情况.

image

image

第二种,还可以通过SQL Server提供的DDL(Data Definition Language)触发器功能。注意,使用DDL触发器,需要在结构发生改动前,就开始创建DDL触发器,并把DDL触发的內容写入到DBA管理专用的数据库对应表中,方便日后查询使用。这方法真实现起来是有点繁琐,如要跟踪表结构的改动情况,需要在数据库实例的每一个数据库层层创建针对表结构改动的DDL触发器。

 (备注: 在不同版本的SQL Server中,以上查询语句,返回的列,或使用方法可能存在差异,当碰到具体的问题可以查阅联机帮助文档)

小結


      以上提供了三种方法,來跟踪数据库中对象(Object)的结构改动情况。当然还可以通过第三方检查日志文件的工具,在当前文章中,这方面不作描述。无论使用哪一种方法,我们都是要把问题原因找出來,并去解决它。作为一名SQL Server DBA,不管是新手,还是专家级。SQL Server提供的一些系统函数或存储过程,及其功能,我们都要认真的去了解并多次测试,这样才能在真实的工作中,灵活的运用,快速的发现问题根源,并快速的解决问题。

原文地址:https://www.cnblogs.com/wghao/p/2185704.html