触发器详细介绍

上传人:m**** 文档编号:508262730 上传时间:2023-09-03 格式:DOCX 页数:7 大小:22.13KB
返回 下载 相关 举报
触发器详细介绍_第1页
第1页 / 共7页
触发器详细介绍_第2页
第2页 / 共7页
触发器详细介绍_第3页
第3页 / 共7页
触发器详细介绍_第4页
第4页 / 共7页
触发器详细介绍_第5页
第5页 / 共7页
点击查看更多>>
资源描述

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

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

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

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

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

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

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

7、CREATE TRIGGERCREATE TRIGGER触发器名称 ON表名FOR INSERT、UPDATE 或 DELETEAST-SQL语句注意:触发器名称是不加引号的。如下是联机丛书上的一个示例,当在titles表上更改记录时,发送邮件通知MaryM。CREATE TRIGGER reminderON titlesFOR INSERT, UPDATE, DELETEASEXEC master.xp_sendmail MaryM,Dont forget to print a report for the distributors.五、删除触发器用查询分析器删除在查询分析器中使用drop

8、trigger触发器名称来删除触发器。 也可以同时删除多个触发器:drop trigger触发器名称,触发器名称.注意:触发器名称是不加引号的。在删除触发器之前可以先看一下触发器是否存在:if Exists(select name from sysobjects where name=触发器名称 and xtype=TR)用企业管理器删除在企业管理器中,在表上点右键-“所有任务”-“管理触发器”,选中所要删除的触发器,然后点击删 除”。六、重命名触发器用查询分析器重命名exec sp_rename原名称,新名称sp_rename是SQL Server自带的一个存储过程,用于更改当前数据库中用户

9、创建的对象的名称, 如表名、列表、索引名等。用企业管理器重命名在表上点右键-“所有任务”-“管理触发器”,选中所要重命名的触发器,修改触发器语句中的触发器 名称,点击“确定”。四、moreINSTEAD OF执行触发器语句,但不执行触发触发器的SQL语句,比如试图删除一条记录时,将执行触发器指定 的语句,此时不再执行delete语句。例:create trigger fon tblinstead of deleteasinsert into Logs.IF UPDATE例名)检查是否更新了某一列,用于insert或update,不能用于delete。例:create trigger fon t

10、blfor updateasif update(status) or update(title)sql_statement -更新了 status 或 title 歹Uinserted、deleted这是两个虚拟表,inserted保存的是insert或update之后所影响的记录形成的表,deleted保存的是 delete或update之前所影响的记录形成的表。例:create trigger tbl_deleteon tblfor deleteasdeclare title varchar(200)select title=title from deletedinsert into Lo

11、gs(logContent) values(删除了 title 为:+ title + 的记录)说明:如果向inserted或deleted虚拟表中取字段类型为text、image的字段值时,所取得的值将会 是 null。七、査看数据库中所有的触发器在查询分析器中运行:use数据库名goselect*fromsysobiectswherextype=TRsysobjects保存着数据库的对象,其中xtype为TR的记录即为触发器对象。在name 一列,我们 可以看到触发器名称。八、sp_helptext査看触发器内容用查询分析器查看use数据库名goexecsp helptext触发器名称将会

12、以表的样式显示触发器内容。除了触发器外,sp_helptext还可以显示 规则、默认值、未加密的存储过程、用户定义函数、视图的 文本用企业管理器查看在表上点右键-“所有任务”-“管理触发器”,选择所要查看的触发器存储过程九、sp_helptrigger用于査看触发器的属性sp_helptrigger有两个参数:第一个参数为表名;第二个为触发器类型,为char(6)类型,可以是 INSERT、UPDATE、DELETE,如果省略则显示指定表中所有类型触发器的属性。例:use数据库名goexecsp helptriggertbl十、递归、嵌套触发器递归分两种,间接递归和直接递归。我们举例解释如下,

13、假如有表1、表2名称分别为Tl、T2,在T1、 T2上分别有触发器G1、G2。 间接递归:对T1操作从而触发G1,G1对T2操作从而触发G2, G2对T1操作从而再 次触发G1. 直接递归:对T1操作从而触发G1,G1对T1操作从而再次触发G1.1、嵌套触发器类似于间接递归,间接递归必然要形成一个环,而嵌套触发器不一定要形成一个环,它可以 T1-T2-T3这样一直触发下去,最多允许嵌套32层。2、设置直接递归默认情况下是禁止直接递归的,要设置为允许有两种方法:T-SQL: exec sp_dboption dbName; recursive triggers, true EM:数据库上点右键-

14、 属性- 选项。3、设置间接递归、嵌套默认情况下是允许间接递归、嵌套的,要设置为禁止有两种方法: T-SQL: exec sp_configure nested triggers, 0 -第二个参数为 1 则为允许 EM:注册上点右键- 属性- 服务器设置。十一、触发器回滚我们看到许多注册系统在注册后都不能更改用户名,但这多半是由应用程序决定的,如果直接打开 数据库表进行更改,同样可以更改其用户名,在触发器中利用回滚就可以巧妙地实现无法更改用户名。 use数据库名gocreate trigger tron表名for updateasif update(userName)rollback tra

15、n关键在最后两句,其解释为:如果更新了 userName歹U,就回滚事务。十二、禁用、启用触发器禁用:alter table表名disable trigger触发器名称启用:alter table表名enable trigger触发器名称如果有多个触发器,则各个触发器名称之间用英文逗号隔开。如果把“触发器名称”换成“ALL”,则表示禁用或启用该表的全部触发器。十三、触发器限制CREATE TRIGGER必须是批处理中的第一条语句,并且只能应用到一个表中。触发器只能在当前的数据库中创建,不过触发器可以引用当前数据库的外部对象。 如果指定触发器所有者名称以限定触发器,请以相同的方式限定表名。在同一条CREATE TRIGGER语句中,可以为多种用户操作(如INSERT和UPDATE)定义相同的 触发器操作。如果一个表的外键在DELETE心PDATE操作上定义了级联,则不能在该表上定义INSTEAD OF DELETE/UPDATE 触发器。在触发器内可以指定任意的SET语句。所选择的SET选项在触发器执行期间有效,并在触

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

最新文档


当前位置:首页 > 学术论文 > 其它学术论文

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