资源预览内容
第1页 / 共13页
第2页 / 共13页
第3页 / 共13页
第4页 / 共13页
第5页 / 共13页
第6页 / 共13页
第7页 / 共13页
第8页 / 共13页
第9页 / 共13页
第10页 / 共13页
亲,该文档总共13页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
第11章 触发器第11章 触发器 本章学习目标严格地说,触发器也是一种特殊类型的存储过程,它与表的关系很密切,常用于保护表中的数据。本章主要内容包括触发器的概念、作用、类型,创建触发器的方法,如何对触发器进行管理等。通过本章的学习,读者应了解触发器的概念、作用、类型,熟悉利用存储过程和触发器维护数据完整性的方法,掌握创建和管理触发器的方法等。 学习重点与难点 触发器的概念、作用、类型等 创建触发器的方法 查看、修改和删除触发器的方法 查看依赖关系u 利用存储过程和触发器维护数据完整性的方法111 触发器概述学习和使用触发器,首先应对概念等有个详细的了解。本节就先来介绍有关触发器的概念、作用、类型等内容。11.1.1 触发器的概念触发器(triegger)是一种特殊类型的存储过程,它与表紧密相连,可看作是表格定义的一部分。触发器是在特定表上进行定义的,该表也称为触发器表。触发器不能被显式地调用,当有操作针对触发器表时,例如在表中插入、删除、修改数据时,如果该表有相应操作类型的触发器,那么触发器就自动触发执行。使用触发器可实施更为复杂的数据完整性约束。触发器基于一个表创建,但是可以针对多个表进行操作,所以触发器常被用来实现复杂的商业规则。例如,在pubs数据库中,存放着出版商(publishers)的信息,存放着出版物(titles)的信息,还存放着出版物与作者关联的信息(titleauthor)以及作者信息(authors)。现在,有一条出版商的信息被删除了,则所有由该出版商出版的出版物都应该将pu_id修改为NULL,或者删除有关的出版物信息。同样,titleauthor表中的信息也应该相应地得到修改。这种涉及到三张表的一致性维护问题,可以使用触发器来实现。在publishers表上设置一个DELETE触发器,当删除一条publishers信息时,触发器自动执行,对titles表和publishers进行修改。在SQL Server中,一张表可以有多个触发器。用户可以针对INSERT、UPDATE或DELETE语句分别设置触发器,也可以针对一张表上的特定操作设置多个触发器。触发器里可以容纳非常复杂的T-SQL语句。但是,不管触发器所进行的操作有多复杂,触发器都只作为一个独立的单元被执行,被看作是一个事务。如果在执行触发器的过程中发生错误,则整个事务将会被自动回滚。触发器和存储过程也是有区别的:存储过程是在数据库上定义的,而触发器是在特定表上进行定义的;存储过程可以由用户直接调用执行,但触发器不能直接调用执行,而是SQL SERVER自动触发执行的。触发器不允许带参数。11.1.2 触发器的作用使用触发器的最终目的是更好地维护企业的业务规则。在实际应用中,触发器主要提供以下功能:u 级联修改数据库中的所有相关表,如上一节中所述。u 撤消回滚违反引用完整性的操作,防止非法修改数据。u 执行比检查约束更复杂的约束操作。u 查找在数据库修改前后,表状态之间的差别,并根据差别来分别采取相应的措施。u 在一张表的同一类型的操作是设置多个触发器,从而可以针对同样的修改语句执行不同的多种操作。11.1.3 触发器的类型SQL Server 2000提供了两种触发器:INSTEAD OF和AFTER触发器。这两种触发器的差别在于他们被激活的时机不同:u AFTER 触发器在触发它们的语句完成后执行。AFTER 触发器在约束检查之后执行,如果该语句因错误(如违反约束或语法错误)而失败,触发器将不会执行。不能为视图指定 AFTER 触发器,只能为表指定该触发器。可以为每个触发操作(INSERT、UPDATE 或 DELETE)指定多个 AFTER 触发器。如果表有多个 AFTER 触发器,可使用 sp_settriggerorder 定义哪个 AFTER 触发器最先激发,哪个最后激发。除第一个和最后一个触发器外,所有其它的 AFTER 触发器的激发顺序不确定,并且无法控制。在 SQL Server 2000 中 AFTER 是默认触发器。不能在 SQL Server 7.0 版或更早的版本中指定 AFTER 或 INSTEAD OF,这些版本中的所有触发器都作为 AFTER 触发器运行。u INSTEAD OF 触发器是SQL Server 2000引进的一种新的触发器类型,用于替代引起触发器执行的T-SQL语句。可在表和视图上指定 INSTEAD OF 触发器。在 SQL Server 2000 中,不能为每个触发操作(INSERT、UPDATE 和 DELETE)定义多个 INSTEAD OF 触发器。INSTEAD OF 触发器在约束检查之前执行。11.1.4 与触发器密切相关的两个专用表在使用触发器过程中,SQL Server使用到了两个特殊的临时表:inserted表和deleted表。这是两个逻辑表,由系统来维护,不允许用户直接对这两个表进行修改。这两张表都存在与高速缓存中(如果内存不够用,也可能存储在硬盘上),实际上是事务日志的视图,它们与被该触发器作用的表的结构相同。触发器工作完成后,这两个表也会被删除。用户可以使用这两张临时表来检测某些修改操作所产生的效果。例如,可以使用SELECT语句来检查INSERT语句和UPDATE语句执行的插入操作是否成功,触发器被这些语句触发等。但是不允许用户直接修改inserted和deleted临时表中的数据。inserted和deleted表都是针对当前触发器的局部临时表,这些表只对应于当前触发器的基本表。如果在触发器中使用、了存储过程,或者是产生了嵌套触发器的情况,则不同的触发器将会使用属于自己基本表的inserted和deleted临时表。u inserted表:存储着被DELETE和UPDATE语句影响的新的数据行。当用户执行DELETE或UPDATE语句时,新的数据行被添加到inserted表中,同时这些数据行的备份被复制到inserted临时表中。u deleted表:存储着被DELETE和UPDATE语句影响的旧数据行。在执行DELETE或UPDATE语句过程中,指定的数据行被用户从基表中删除,然后转移到了deleted表中。一般来说,在基表和deleted表中不会存在有相同的数据行。对INSERT操作,只在inserted表中保存所插入的新行,而deleted表中无数据。对于DELETE操作,只在deleted表中保存被删除的旧行,而inserted表中无数据。对于UPDATE操作,可以将它看作先执行一个DELETE操作,再执行一个INSERT操作的结果,旧的行首先被移动到deleted表中,然后新行同时插入激活触发器的表和inserted表中,所以在inserted表中存放着更新后的新行值,deleted表中存放着更新前的旧行值。112 创建触发器在创建触发器之前,用户需要注意以下的几点事项:u CRAETE TRIGGER语句必须是一个批中的第一条语句。u 创建触发器的权限默认是属于表的所有者的,而且不能再授权给他人。u 触发器是数据库对象,它的命名必须符合命名规则。u 只能在当前数据库中创建触发器,但触发器可以引用其他数据库的对象。u 触发器不能在临时表或系统表上创建,触发器中可引用临时表,但不能引用系统表。u 尽管TRUNCATE TABLE语句很像一个没有WHERE子句的DELETE语句(二者都是删除表中的所有行),但TRUNCATE TABLE的操作不被记入事务日志,所以它也不会激活DELETE触发器。u WRITETEXT语句不会激活INSERT或UPDATE触发器。u 如果指定触发器所有者名限定触发器,要以相同的方式限定表名。u 在同一个CRAETE TRIGGER语句中,可以为多种操作定义相同的触发器操作。u 如果一个表的外键在DELETE、UPDATE操作上定义了级联,则不能在该表上定义INSTEAD OF DELETE、INSTEAD OF UPDATE触发器。u 在触发器内可以指定任意的SET语句,所选择的SET选项在触发器执行期间有效,并在触发器执行完后恢复到以前的设置。u 触发器不能返回任何结果,为了阻止从触发器返回结果,不在触发器定义中包含SELECT语句或变量赋值。如果必须在触发器中进行变量赋值,则应该在触发器的开头使用SET NOCOUNT语句,以免返回任何结果集。在创建触发器时需要制定以下内容:u 触发器的名称。u 触发器所基于的表或视图。u 触发器激活的时机。u 激活触发器的修改语句,有效的选项是INSERT、UPDATE和DELETE。u 触发器执行的语句。11.2.1 使用T-SQL语句创建触发器使用T-SQL语句创建触发器的语法格式为:CREATE TRIGGER trigger_nameON table_name|view_nameWITH ENCRYPTION FOR | AFTER | INSTEAD OF DELETE , INSERT , UPDATE NOT FOR REPLICATIONASsql_statement 其中各选项的含义如下:u trigger_name:触发器名称。u table_name、view_name:指出了所创建的触发器与之相关联的表或视图的名字。u WITH ENCRYPTION:触发器作为一种数据库对象,在syscomments表中存储有完整的文本定义信息。可以使用WITH ENCRYPTION对访问syscomments表不入口进行加密。u FOR | AFTER | INSTEAD OF:指定触发器的类型,AFTER为默认类型。u NOT FOR REPLICATION:定义在复制过程中,不执行触发器操作。11.2.2 创建AFTER触发器 1、INSERT触发操作INSERT(插入)触发操作触发器的执行过程如下:(1)首先执行INSERT语句进行数据插入。系统检查被插入新值的正确性(如:约束等),如果正确,将新行插入到表中。(2)执行该表INSERT触发器中的相应语句。如果执行到ROLLBACK操作,则系统将回滚整个操作(删除第一步插入的新值,对触发器中已经执行的操作做反操作)。例如,为Supermarket数据库的Goods表创建一个INSERT触发器,当在Goods表中插入一行数据时,若该供应商号在Supplier表中不存在,则给出出错信息,并使插入不能进行(只针对插入单行数据,不包含对多行数据的判断)。创建触发器的具体代码如下:USE Supermarket/* 如果存在同名的触发器,则删除之 */IF EXISTS(SELECT name FROM sysobjects WHERE type=TR AND name=goods_insert)DROP TRIGGER goods_insertGO/* 创建触发器 */CREATE TRIGGER goods_insertON GoodsAFTER INSERTAS IF NOT EXISTS(SELECT * FROM Goods JOIN Supplier ON Goods. 供应商号=Supplier.供应商号) BEGIN Print 插入的供应商号在Supplier表中不存在,插入无效!Rollback END以下语句用于向Goods表中插入数据:USE SupermarketINSERT IN
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号