触发器详细介绍.doc

上传人:桔**** 文档编号:562023584 上传时间:2024-02-24 格式:DOC 页数:7 大小:50.51KB
返回 下载 相关 举报
触发器详细介绍.doc_第1页
第1页 / 共7页
触发器详细介绍.doc_第2页
第2页 / 共7页
触发器详细介绍.doc_第3页
第3页 / 共7页
触发器详细介绍.doc_第4页
第4页 / 共7页
触发器详细介绍.doc_第5页
第5页 / 共7页
点击查看更多>>
资源描述

《触发器详细介绍.doc》由会员分享,可在线阅读,更多相关《触发器详细介绍.doc(7页珍藏版)》请在金锄头文库上搜索。

1、触发器一、 触发器概述触发器是一种特殊类型的存储过程,不由用户直接调用。创建触发器时会对其进行定义,以便在对特定表或列作特定类型的数据修改时执行。CREATE PROCEDURE 或 CREATE TRIGGER 语句不能跨越批处理。即存储过程或触发器始终只能在一个批处理中创建并编译到一个执行计划中。用触发器还可以强制执行业务规则。Microsoft SQL Server提供了两种主要机制来强制业务规则和数据完整性:约束和触发器。触发器是一种特殊类型的存储过程,它在指定的表中的数据发生变化时自动生效。唤醒调用触发器以响应 INSERT、UPDATE 或 DELETE 语句。触发器可以查询其它表

2、,并可以包含复杂的 Transact-SQL 语句。将触发器和触发它的语句作为可在触发器内回滚的单个事务对待。如果检测到严重错误(例如,磁盘空间不足),则整个事务即自动回滚。二、触发器的优点触发器可通过数据库中的相关表实现级联更改;不过,通过级联引用完整性约束可以更有效地执行这些更改触发器可以强制比用 CHECK 约束定义的约束更为复杂的约束。与 CHECK 约束不同的是,触发器可以引用其它表中的列。例如,触发器可以使用另一个表中的 SELECT 比较插入或更新的数据,以及执行其它操作,如修改数据或显示用户定义错误信息。触发器也可以评估数据修改前后的表状态,并根据其差异采取对策。一个表中的多个

3、同类触发器(INSERT、UPDATE 或 DELETE)允许采取多个不同的对策以响应同一个修改语句。 触发器是自动的:它们在对表的数据作了任何修改(比如手工输入或者应用程序采取的操作)之后立即被激活。 触发器可以通过数据库中的相关表进行层叠更改。例如,可以在 titles 表的 title_id 列上写入一个删除触发器,以使其它表中的各匹配行采取删除操作。该触发器用 title_id 列作为唯一键,在 titleauthor、sales 及 roysched 表中对各匹配行进行定位。 三、比较触发器与约束 约束和触发器在特殊情况下各有优势。触发器的主要好处在于它们可以包含使用 Transac

4、t-SQL 代码的复杂处理逻辑。因此,触发器可以支持约束的所有功能;但它在所给出的功能上并不总是最好的方法。 实体完整性总应在最低级别上通过索引进行强制,这些索引或是 PRIMARY KEY 和 UNIQUE 约束的一部分,或是在约束之外独立创建的。假设功能可以满足应用程序的功能需求,域完整性应通过 CHECK 约束进行强制,而引用完整性 (RI) 则应通过 FOREIGN KEY 约束进行强制。 在约束所支持的功能无法满足应用程序的功能要求时,触发器就极为有用。例如: 除非 REFERENCES 子句定义了级联引用操作,否则 FOREIGN KEY 约束只能以与另一列中的值完全匹配的值来验证

5、列值。 CHECK 约束只能根据逻辑表达式或同一表中的另一列来验证列值。如果应用程序要求根据另一个表中的列验证列值,则必须使用触发器。 约束只能通过标准的系统错误信息传递错误信息。如果应用程序要求使用(或能从中获益)自定义信息和较为复杂的错误处理,则必须使用触发器。 触发器可通过数据库中的相关表实现级联更改;不过,通过级联引用完整性约束可以更有效地执行这些更改。 触发器可以禁止或回滚违反引用完整性的更改,从而取消所尝试的数据修改。当更改外键且新值与主键不匹配时,此类触发器就可能发生作用。例如,可以在 titleauthor.title_id 上创建一个插入触发器,使它在新值与 titles.t

6、itle_id 中的某个值不匹配时回滚一个插入。不过,通常使用 FOREIGN KEY 来达到这个目的。 如果触发器表上存在约束,则在 INSTEAD OF 触发器执行后但在 AFTER 触发器执行前检查这些约束。如果约束破坏,则回滚 INSTEAD OF 触发器操作并且不执行 AFTER 触发器。四、创建一个简单的触发器触发器是一种特殊的存储过程,类似于事件函数,SQL Server 允许为 INSERT、UPDATE、DELETE 创建触发器,即当在表中插入、更新、删除记录时,触发一个或一系列 T-SQL语句。触发器可以在查询分析器里创建,也可以在表名上点右键-“所有任务”-“管理触发器”

7、来创建,不过都是要写 T-SQL 语句的,只是在查询分析器里要先确定当前操作的数据库。创建触发器用 CREATE TRIGGERCREATE TRIGGER 触发器名称ON 表名FOR INSERT、UPDATE 或 DELETEAS T-SQL 语句注意:触发器名称是不加引号的。如下是联机丛书上的一个示例,当在 titles 表上更改记录时,发送邮件通知 MaryM。CREATE TRIGGER reminderON titlesFOR INSERT, UPDATE, DELETE AS EXEC master.xp_sendmail MaryM, Dont forget to print

8、a report for the distributors.五、删除触发器用查询分析器删除在查询分析器中使用 drop trigger 触发器名称 来删除触发器。也可以同时删除多个触发器:drop trigger 触发器名称,触发器名称.注意:触发器名称是不加引号的。在删除触发器之前可以先看一下触发器是否存在:if Exists(select name from sysobjects where name=触发器名称 and xtype=TR)用企业管理器删除在企业管理器中,在表上点右键-“所有任务”-“管理触发器”,选中所要删除的触发器,然后点击“删除”。六、重命名触发器用查询分析器重命名e

9、xec sp_rename 原名称, 新名称sp_rename 是 SQL Server 自带的一个存储过程,用于更改当前数据库中用户创建的对象的名称,如表名、列表、索引名等。用企业管理器重命名在表上点右键-“所有任务”-“管理触发器”,选中所要重命名的触发器,修改触发器语句中的触发器名称,点击“确定”。四、more.INSTEAD OF执行触发器语句,但不执行触发触发器的 SQL 语句,比如试图删除一条记录时,将执行触发器指定的语句,此时不再执行 delete 语句。例:create trigger fon tblinstead of deleteas insert into Logs.IF

10、 UPDATE(列名)检查是否更新了某一列,用于 insert 或 update,不能用于 delete。例:create trigger fon tblfor updateas if update(status) or update(title) sql_statement -更新了 status 或 title 列inserted、deleted这是两个虚拟表,inserted 保存的是 insert 或 update 之后所影响的记录形成的表,deleted 保存的是 delete 或 update 之前所影响的记录形成的表。例:create trigger tbl_deleteon t

11、blfor deleteas declare title varchar(200) select title=title from deleted insert into Logs(logContent) values(删除了 title 为: + title + 的记录)说明:如果向 inserted 或 deleted 虚拟表中取字段类型为 text、image 的字段值时,所取得的值将会是 null。七、查看数据库中所有的触发器在查询分析器中运行:use数据库名goselect*fromsysobjectswherextype=TRsysobjects 保存着数据库的对象,其中 xtyp

12、e 为 TR 的记录即为触发器对象。在 name 一列,我们可以看到触发器名称。八、sp_helptext 查看触发器内容用查询分析器查看use数据库名goexecsp_helptext触发器名称将会以表的样式显示触发器内容。除了触发器外,sp_helptext 还可以显示 规则、默认值、未加密的存储过程、用户定义函数、视图的文本用企业管理器查看在表上点右键-“所有任务”-“管理触发器”,选择所要查看的触发器存储过程九、sp_helptrigger 用于查看触发器的属性sp_helptrigger 有两个参数:第一个参数为表名;第二个为触发器类型,为 char(6) 类型,可以是 INSERT

13、、UPDATE、DELETE,如果省略则显示指定表中所有类型触发器的属性。例:use数据库名goexecsp_helptriggertbl 十、递归、嵌套触发器递归分两种,间接递归和直接递归。我们举例解释如下,假如有表1、表2名称分别为 T1、T2,在 T1、T2 上分别有触发器 G1、G2。 间接递归:对 T1 操作从而触发 G1,G1 对 T2 操作从而触发 G2,G2 对 T1 操作从而再次触发 G1. 直接递归:对 T1 操作从而触发 G1,G1 对 T1 操作从而再次触发 G1.1、嵌套触发器类似于间接递归,间接递归必然要形成一个环,而嵌套触发器不一定要形成一个环,它可以 T1-T2

14、-T3.这样一直触发下去,最多允许嵌套 32 层。2、设置直接递归默认情况下是禁止直接递归的,要设置为允许有两种方法: T-SQL:exec sp_dboption dbName, recursive triggers, true EM:数据库上点右键-属性-选项。3、设置间接递归、嵌套默认情况下是允许间接递归、嵌套的,要设置为禁止有两种方法: T-SQL:exec sp_configure nested triggers, 0 -第二个参数为 1 则为允许 EM:注册上点右键-属性-服务器设置。 十一、触发器回滚我们看到许多注册系统在注册后都不能更改用户名,但这多半是由应用程序决定的, 如果

15、直接打开数据库表进行更改,同样可以更改其用户名,在触发器中利用回滚就可以巧妙地实现无法更改用户名。use 数据库名gocreate trigger tron 表名for updateas if update(userName) rollback tran关键在最后两句,其解释为:如果更新了 userName 列,就回滚事务。十二、禁用、启用触发器禁用:alter table 表名 disable trigger 触发器名称启用:alter table 表名 enable trigger 触发器名称如果有多个触发器,则各个触发器名称之间用英文逗号隔开。如果把“触发器名称”换成“ALL”,则表示禁用或启用该表的全部触发器。十三、触发器限制CREATE TRIGGER 必须是批处理中的第一条语句,并且只能应用到一个表中。触发器只能在当前的数据库中创建,不

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 生活休闲 > 社会民生

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号