在SQL Server 2005的ddl触发器中使用eventdata()函数
2010-08-16 15:45:20 来源:WEB开发网问题
在您的服务器实例中,针对SQL Server 2005的提示里,在运行数据定义语言 (Create,Alter,Drop)的命令中,你就可以看到如何跟踪DDL的活动,但我们如何 存储这些事件,用来捕获这些DDL触发器并且存储在表中为反馈的信息呢?
Solution解决方案
在SQL Server 2005中 ,您可以通过访问eventdata ( )函数,用来触发ddl事 件而获取数据。 这个函数返回的是服务器或数据库事件的信息,并以XML数据类 型的方式储存在一个变量中使用。 我们需要做的是捕捉eventdata ( )函数返回 的数据,并将它储存在数据库的表中为反馈的信息。在把数据存储在表中的列之 前,您可以把储存的数据直接放在XML的一列或者过程中。
不过,由于返回的类型是XML ,我们需要运用的就是用XQuery所产生的数据的 功能,以确定XML元素数据的返回,关于事件使用的索引或搜索相关的话题,请访 问SQL Server的联机丛书。 由于这个特殊技巧,我们将使用表有关的事件。 该 ddl_table_events类型说明什么数据可以捕获一个CREATE,ALTER或者DROP表的事 件。
让我们来用Northwind数据库来举一个例子。 我们将创建一个表,将用来存储 eventdata ( )函数传回来的数据。 我们从ALTER_TABLE事件引起的架构中只将选 择一些项目; 即在每个事件中包括TSQLCommand、PostTime、LoginName和 EventType这样的字段。
创建事件日志表
USENorthwindUSENorthwind
GO
CREATETABLEEvtLog
(
PostTimeDATETIME,
LoginNameNVARCHAR(100),
EventTypeNVARCHAR(100),
TSQLCommandNVARCHAR(2000)
)
GOGO
创建ddl触发
CREATETRIGGERtrPreventTblChangeCREATETRIGGERtrPreventTblChange
ONDATABASE
FORALTER_TABLE
AS
DECLARE@DataXML
SET@Data=EventData()
INSERTEvtLog (PostTime,LoginName,EventType,TSQLCommand)
VALUES
(GETDATE (),
CONVERT(NVARCHAR(100),CURRENT_USER),
@Data.value ('(/EVENT_INSTANCE/EventType)[1]','nvarchar(100)'),
@Data.value ('(/EVENT_INSTANCE/TSQLCommand)[1]','nvarchar(2000)'));
GO
更多精彩
赞助商链接