在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触发器来记录事件……
我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。
我原创,你原创,我们的内容世界才会更加精彩!
【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】
微信公众号
TechTarget
官方微博
TechTarget中国
在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格式)。当事件发生时,该方法提供所需的值。
这就是设置基本的审计解决方法的所有代码。现在,让我们来验证一下结果。
翻译
TechTarget中国特约技术编辑,某高校计算机科学专业教师和网络实验室负责人,曾任职某网络国际厂商,关注数据中心、开发运维、数据库及软件开发技术。有多本关于思科数据中心和虚拟化技术的译著,如《思科绿色数据中心建设与管理》和《基于IP的能源管理》等。
相关推荐
-
SQL Server 2005支持服务结束 升级何去何从
SQL Server 2005的支持就要结束了,就在2016年4月12日,SQL Server 2005的客户们应该升级了。
-
SQL Server 2005即将终止服务 你准备好了么?
2016年4月12日,微软将正式终止SQL Server 2005相关服务。微软正在终止扩展支持,这意味着不再有新特性更新,什么都没了。
-
解决SQL服务器提示属性IsLocked不可用于登录用户的错误
在SQL Server中,权限的分配很重要。特别是在用户数量众多的数据库里面,用户权限,架构的划分经常会导致权限之间的冲突,导致无法登陆。
-
TT数据库特别推荐:SQL Server编年史
无论是菜鸟还是资深DBA,除了要掌握基本的数据库管理、操作之外,还需要对不同产品的发展历史有一个了解。