技术开发 频道

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

  【IT168 技术文档】在SQL Server 2005之前,我们只能定义Data Manipulation Language (DML)触发器。当执行DML语句时,如UPDATE或DALETE,这些触发器就会启动。在SQL Server 2005发布之后,现在可以定义Data Definition Language (DDL)触发器了。当执行DDL语句,如CREATE TABLE和ALTER VIEW,这些类型的触发器就会启动,并且这使得使用DDL触发器来审计SQL Server中的DDL事件更加容易了。

  其中一个可以用来审计DDL事件的方法是先创建一个表来存储相关的事件数据,然后创建一个DDL触发器来记录事件。在本文中,我将阐述每个步骤并举例说明每个概念。对于所举的例子,我将在传输SQL Server 2005的AdventureWorks示例数据库中创建一个审计表和DDL触发器。注意,本文的前提条件就是假定你已经非常熟悉Transact-SQL和DDL概念。

  创建DDL审计表

  审计表存储每次指定类型的DDL事件发生时产生的事件相关信息。比如,如果从数据库中删除一个视图,那么就会产生一个DROP_VIEW事件。我们可以使用DDL触发器来捕捉事件信息并存储在表中。

  每个审计表都必须至少包含一个XML字段来存储事件相关数据。后面将介绍SQL Server是如何生成XML格式的数据的。当然,这个表也必须包含一个主键字段。下面的语句在AdventureWorks数据库中创建了一个基本的审计表:

CREATE TABLE dbo.EventLog
(EventID
INT PRIMARY KEY IDENTITY
EventInstance XML
NOT NULL)
GO

  注意,我已经将EventID列作为主键,以及EventInstance,并介绍了字段是如何保存与每个事件相关的XML数据的。每次DDL事件生成时,就会有一行添加到表格中。然后,我们可以检索EventInstance字段的内容来查看指定事件的信息。

  创建DDL触发器

  在创建了审计表之后,我们必须定义DDL触发器。下面的CREATE TRIGGER语句定义了一个触发器,当每次在AdventureWorks数据库中发生DDL事件时,它将在EventLog表中插入事件相关的数据:

CREATE TRIGGER LogEvents
ON DATABASE
AFTER DDL_DATABASE_LEVEL_EVENTS
AS
INSERT INTO dbo.EventLog (EventInstance)
VALUES (EVENTDATA())

  让我们详细地来看看每一行的代码以便更好的理解它。CREATE TRIGGER子句只是简单地标识新的触发器的名称,也就是LogEvents。第二行——ON DATEBASE——表示触发器将在数据库级上创建。当然,也可以在服务器上创建触发器,它会在服务器发生DDL事件时启动,这时就应该使用ON ALL SERVER选项。然而,对于这个例子,我们关注的仅仅是与AdventureWorks数据库相关的DDL事件。

  下一行代码——AFTER DDL_DATABASE_LEVEL_EVENTS——是一个AFTER子句。这个子句的第一部分是一个AFTER关键字,它表示只有在相关的操作(特别是子句的第二部分)已经成功的执行了才启动触发器。如果不用AFTER,可以用FOR关键字,这就意味着一发生DDL事件就启动事件。因此,我更喜欢在它们成功的运行了之后才记录这些操作。

  AFTER子句的下一个部分指定了事件类型或组。因此你必须规定哪件DDL事件能够引发触发器启动。因为我想要审计数据库级的所有DDL事件,所以我选择了DDL_DATABASE_LEVEL_EVENTS选项(一个事件组)。但是,你可以选择其它的组或某个事件类型。如果指定一个以上的事件组或类型,那么需要使用逗号分隔选项。更多关于每个事件类型和组的详细信息,可以阅读Microsoft SQL Server Books Online上的“CREATE TRIGGER (Transact-SQL)”专栏。

  当我指定了事件组之后,我使用了一个AS关键字,然后是INSERT语句。这个语句在每次触发器启动时插入一行数据到EventLog表中。我通过调用EVENDATE()系统方法获得了EventInstance字段的值,它可以检索事件相关的数据(以XML格式)。当事件发生时,该方法提供所需的值。

  这就是设置基本的审计解决方法的所有代码。现在,让我们来验证一下结果。

0
相关文章