技术开发 频道

在SQL Server 2005中创建DDL表格来审计DDL触发活动

  测试审计方法

  非常好的的测试方法就是运行一对针对AdventureWorks数据库的DDL语句。下面的语句创建了Person、Contact2表,接着删除了表:

SELECT FirstName, LastName, EmailAddress
INTO Person.Contact2
FROM Person.Contact
GO
DROP TABLE Person.Contact2

 

  两个语句都应该在AdventureWorks上生成DDL事件,接着启动LogEvents触发器。为了验证触发器是否正确地记录了这两个事件,只需简单的运行下面的SELECT语句:

SELECT * FROM dbo.EventLog

  语句必须返回两行。在每一行,EventInstance字段都必须包含一个与具体事件相关的XML。如果查看第一行的XML,那么结果应该是这样的:

  注意,事件数据包含了事件类型、创建的对象以及用于创建表格的命令和其它的信息。如果只想从EventInstance字段中检索特定的信息,可以使用XQuery表达式来访问单个元素值。比如,下面的SELECT语句使用了XML value()方法来检索事件类型、模式名和对象名:

SELECT EventID,
EventInstance.value(
'(//EventType)[1]',  
'nvarchar(30)') AS EventType,
EventInstance.value(
'concat((//SchemaName)[1],  
".", (//ObjectName)[1])
''nvarchar(60)')  
AS ObjectName
FROM dbo.EventLog

 

  正如你所看到的,我先通过指定XML数据类型定义的EventInstance字段调用了value()方法。我可以以这种方法调用任意的XML方法。value()方法包含两个参数。第一个定义了我所要检索的XML元素。第二个定义了数据类型。第一个参数必须包含在括号中,并且后面加上[1],因为value()方法总是返回标量值,。即使指定的元素是在XML(如本例子)中是唯一的也必须指定[1]。当运行这个SELECT语句时,会得到下面的结果:

EventID

EventType

ObjectName

1

CREATE_TABLE

Person.Contact2

2

DROP_TABLE

Person.Contact2

                    (2 row(s) affected)

  结果显示的是CREATE_TABLE and DROP_TABLE事件类型,这正是我所运行的DDL语句所应该产生的结果。因为SQL Server现在支持Data Definition Language (DDL)触发器,因此可以非常容易地审计由这些语句生成的事件。正如我所阐述的,一个简单的审计事件的方法就是在SQL Server上创建一个审计表,并定义一个触发器。然而,我们也可以使用DDL触发器来执行一些操作,而不是在审计表中插入一行。比如,当一个特别的DDL事件发生时,发送一封邮件到一个指定的接受者。当创建一个DDL触发器时,我们可以定义一个或多个Transact-SQL语句来完成一些特定的操作,这样就可以通过创建触发器来执行各种不同的任务。

0
相关文章