1、第16章 触发器,前面在介绍数据完整性时,提到SQL Server 2008提供了约束、默认值,以及触发器3类对象,用于保证数据的完整性,那时笔者只介绍了约束和默认值,本章主要介绍触发器(Trigger)。其实,触发器就是一类特殊的存储过程。触发器在创建后,一般是在数据库事件的驱动下自动执行的,即当SQL Server中某一个事件发生时,SQL Server将自动执行其相关联的触发器。,16.1 触发器概述,前面介绍的存储过程都是需要手工执行的,即在SQL语句中,用EXECUTE语句执行相应的存储过程;而触发器这类存储过程却由SQL Server自动执行。SQL Server之所以能够自动执行
2、触发器,是因为触发器在创建时,与特定的SQL Server事件相关联。,16.2 登录触发器,登录触发器关联的事件是事件组SecurityAudit的事件AuditLogin,即LOGIN事件。如果用户遗忘了事件或事件组的概念,可以参考前面介绍SQL Server Profiler跟踪的内容。登录触发器是一种AFTER触发器,不过,登录触发器不存在于特定的架构之下。,16.2.1 登录触发器的执行时机和作用,登录触发器的执行时机是用户登录到SQL Server,具体的是在登录过程的身份验证结束之后至建立会话之前。显然,如果身份验证失败,将不激发登录触发器,所以触发器不能检测到用户对于登录的尝试
3、,以及失败的次数。不过,用户可以通过SQL Server的日志了解到这些信息。,16.2.2 SQL登录触发器,所谓SQL登录触发器,是指用普通的SQL语句编写的登录触发器,主要是区别使用CLR编写的登录触发器。如果想要在登录触发器中使用登录事件的信息,可以参看后面DDL中介绍的EVENTDATA函数。 1创建SQL登录触发器 2使用登录触发器 3更改登录触发器 4删除登录触发器,16.2.3 登录触发器的常见错误,用户按照上面的SQL语句创建登录触发器,当然不会产生问题,但是,如果用户自己创建登录触发器时,需要慎重。因为创建登录触发器与创建普通的表、视图、存储过程或函数相比,具有一定的风险。
4、,16.3 DDL 触发器,在SQL Server 2008中,CREATE、ALTER、DROP等语句常被称为数据定义语句,或数据定义语言(Data Definition Language,DDL)。DDL触发器就是与DDL相关联的一种特殊的存储过程。其实,DDL触发器是关联DLL语句对应的SQL Server事件。这类操作被关联相应的DDL触发器后,再执行这类操作时,SQL Server将会自动执行相关联的DDL触发器。DDL触发器是一种AFTER触发器,不存在于特定的架构之下,而存在于特定数据库中或整个SQL Server实例中。,16.3.1 DDL触发器的执行时机和作用,DLL触发器
5、的执行时机是其关联的操作结束以后至下一个操作开始之前。所以,DDL触发器可以帮助用户管理和控制一些与数据库对象定义有关的操作,如管理和记录数据库对象结构的更改。总地来说,DDL触发器主要用在以下几方面。 处理对数据库对象结构的更改。 在数据库对象的结构发生更改后,执行处罚期内定义的操作。 可以记录数据库对象结构的具体更改,以及相应的SQL Server事件。,16.3.2 DLL触发器关联的事件组,DLL触发器关联的事件组依据其使用范围,分为服务器范围内的事件组和数据库范围内的事件组。可以通过SQL语句,查询当前SQL Server的事件组。,16.3.3 DLL触发器关联的事件,在SQL S
6、erver中,与DLL触发器关联的事件都属于预定义的事件组。下面将给出这些事件的详细信息,包括事件的名称、type,以及parent type。具体的,用户可以使用如下SQL语句查询到与DLL触发器关联的事件。,16.3.4 EVENTDATA函数:返回事件的XML结构,在编写DDL触发器时,可能需要获得服务器或数据库事件的信息。这时,就需要使用EVENTDATA函数,其语法结构如下。 返回值=EVENTDATA(),16.3.5 SQL DDL触发器,所谓SQL DDL触发器,是指用普通的SQL语句编写的DDL触发器,主要是区别于使用CLR编写的DDL触发器。 1创建SQL DDL触发器 2
7、使用DDL触发器 3更改DDL触发器 4删除DDL触发器 5查看DDL触发器的信息,16.4 DML触发器,在SQL Server 2008中,INSERT、UPDATE、DELETE等语句常被称为数据操纵语句,或数据操纵语言(Data Manipulation Language,DML)。DML触发器是与DML相关联的一种特殊的存储过程。当DML操作被关联上相应的DML触发器后,再执行这类操作时,SQL Server将会自动执行相关联的DML触发器。显然,DML触发器属于特定的数据库,是对数据库中表或视图操作的限制和拓展。,16.4.1 DML触发器类型,DML触发器有两种分类方法:一类是依
8、据DML触发器关联的DML语句,将DML触发器分为INSERT触发器、UPDATE触发器和DELETE触发器;另一类是依据DML执行过程,将DML触发器分为AFTER触发器和INSTEAD OF触发器。对于一个DML操作来说,其执行过程如下。,16.4.2 DML触发器的作用,与DDL触发器相比,DML触发器的用途更为广泛。这是因为SQL Server中DML语句要比DDL多。所以,对于用户来说,掌握DML触发器很重要。下面简要介绍DML触发器的优点。,16.4.3 DML触发器的创建语句,在SQL Server中,创建DML触发器的语句也是CREATE TRIGGER。不过,语法结构与前面创
9、建DDL触发器有所不同。创建DML触发器的CREATE TRIGGER语句的语法结构如下。 CREATE TRIGGER schema_name . trigger_name ON TABLE | VIEW WITH ENCRYPTION EXECUTE AS clause ,.n FOR | AFTER | INSTEAD OF INSERT , UPDATE , DELETE AS sql_statement ,.n ,16.5 AFTER触发器,前面提到,AFTER触发器是DML操作触发器的一类触发器。其实,如果对AFTER触发器进行细分,那么AFTER触发器可以分为AFTER-INSE
10、RT触发器、AFTER-UPDATE触发器以及AFTER-DELETE触发器3类。,16.5.1 AFTER-INSERT触发器,所谓AFTER-INSERT触发器,是指该INSERT触发器执行位于DML操作中AFTER触发器的位置;而INSERT触发器是指当向表中插入新记录数据时,SQL Server自动执行特殊的存储过程。 1创建AFTER-INSERT触发器 2查看AFTER-INSERT触发器 3执行AFTER-INSERT触发器,16.5.2 AFTER-UPDATE触发器,所谓AFTER-UPDATE触发器,是指该UPDATE触发器执行位于DML操作中AFTER触发器的位置;而UP
11、DATE触发器是指当更新表中记录数据时,SQL Server自动执行特殊的存储过程。 1创建AFTER-UPDATE触发器 2查看AFTER-UPDATE触发器 3执行AFTER-UPDATE触发器,16.5.3 AFTER-DELETE触发器,所谓AFTER-DELETE触发器,是指该DELETE触发器执行位于DML操作中AFTER触发器的位置;而DELETE触发器是指当更新表中记录数据时,SQL Server自动执行特殊的存储过程。 1创建AFTER-DELETE触发器 2查看AFTER-DELETE触发器 3执行AFTER-DELETE触发器,16.6 INSTEAD OF触发器,前面已
12、经介绍了创建AFTER触发器,不过,AFTER触发器仅支持表。本节介绍的INSTEAD OF触发器也包括AFTER-INSERT触发器、AFTER-UPDATE触发器和AFTER-DELETE触发器,但它除支持表外,还支持视图。由于前面已经详细介绍了AFTER触发器的创建、查看以及使用方法,因此这里不再赘述。本节将通过示例来介绍为视图创建INSTEAD OF触发器。,16.7 小结,本章主要介绍触发器的使用。触发器是数据约束很重要的一个技术手段,在更新某个数据时还要修改谁、修改什么,主要用触发器来完成。由于在系统优先级方面,触发器高于存储过程,所以在对重要数据更新时,一般都使用触发器,但滥用触发器也会降低系统速度。触发器是双刃剑,在使用时,一定要谨慎。,