WEB开发网
开发学院数据库MSSQL Server 在SQL Server 2005的ddl触发器中使用eventdata()函... 阅读

在SQL Server 2005的ddl触发器中使用eventdata()函数

 2010-08-16 15:45:20 来源:WEB开发网   
核心提示:问题在您的服务器实例中,针对SQL Server 2005的提示里,在SQL Server 2005的ddl触发器中使用eventdata()函数,在运行数据定义语言 (Create,Alter,Drop)的命令中,你就可以看到如何跟踪DDL的活动, 我们将创建一个表,将用来存储 eventdata ( )函数传回来的

问题

在您的服务器实例中,针对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
[email protected]
[email protected]=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

1 2  下一页

Tags:SQL Server ddl

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接