sql触发器的优缺点

电子常识

2637人已加入

描述

  触发器是一种特殊类型的存储过程,它在指定的表中的数据发生变化时自动生效。唤醒调用触发器以响应 INSERT、UPDATE 或 DELETE 语句。触发器可以查询其它表,并可以包含复杂的Transact-SQL语句。将触发器和触发它的语句作为可在触发器内回滚的单个事务对待。如果检测到严重错误(例如,磁盘空间不足),则整个事务即自动回滚。

  触发器可通过数据库中的相关表实现级联更改;通过级联引用完整性约束可以更有效地执行这些更改。

  触发器可以强制用比 CHECK 约束定义的约束更为复杂的约束。

  与 CHECK 约束不同,触发器可以引用其它表中的列。例如,触发器可以使用另一个表中的 SELECT 比较插入或更新的数据,以及执行其它操作,如修改数据或显示用户定义错误信息。

  触发器也可以评估数据修改前后的表状态,并根据其差异采取对策。

  

  比较触发器与约束

  约束和触发器在特殊情况下各有优势。触发器的主要好处在于它们可以包含使用 Transact-SQL 代码的复杂处理逻辑。因此,触发器可以支持约束的所有功能;但它在所给出的功能上并不总是最好的方法。

  实体完整性总应在最低级别上通过索引进行强制,这些索引或是 PRIMARY KEY 和 UNIQUE 约束的一部分,或是在约束之外独立创建的。假设功能可以满足应用程序的功能需求,域完整性应通过 CHECK 约束进行强制,而引用完整性 (RI) 则应通过 FOREIGN KEY 约束进行强制。

  在约束所支持的功能无法满足应用程序的功能要求时,触发器就极为有用。例如:

  除非 REFERENCES 子句定义了级联引用操作,否则 FOREIGN KEY 约束只能以与另一列中的值完全匹配的值来验证列值。

  CHECK 约束只能根据逻辑表达式或同一表中的另一列来验证列值。如果应用程序要求根据另一个表中的列验证列值,则必须使用触发器。

  约束只能通过标准的系统错误信息传递错误信息。如果应用程序要求使用(或能从中获益)自定义信息和较为复杂的错误处理,则必须使用触发器。

  触发器可通过数据库中的相关表实现级联更改;不过,通过级联引用完整性约束可以更有效地执行这些更改。

  触发器可以禁止或回滚违反引用完整性的更改,从而取消所尝试的数据修改。当更改外键且新值与主键不匹配时,此类触发器就可能发生作用。例如,可以在 titleauthor.title_id 上创建一个插入触发器,使它在新值与 titles.title_id 中的某个值不匹配时回滚一个插入。不过,通常使用 FOREIGN KEY 来达到这个目的。

  如果触发器表上存在约束,则在 INSTEAD OF触发器执行后但在 AFTER触发器执行前检查这些约束。如果约束破坏,则回滚INSTEAD OF触发器操作并且不执行 AFTER触发器。

  

 

  SQL 触发器的作用,优缺点

  触发器,主要是用来同步更新数据的,举个例子吧:

  假设有两个表,tab_1 , tab_2

  再假设两个表里都有“人员性别”这个字段

  tab_1的数据例如: 张三```男```1978`````2002

  tab_2的数据例如: 张三```男```销售科```科长

  我要改tab_1中张三的性别为“女”的话,那么tab_2的性别也该改为“女”,对吧,总不能两张表的性别不同吧。

  如果不用触发器的话,我们就要改完tab_1,再去改tab_2,使性别都变成女

  于是这里可以用到触发器了:

  原理是:当tab_1中某人的性别发生变更后,数据库自动将tab_2的性别进行同步修改

  触发器也可以这样应用:

  1、当删除tab_1中的某人信息时,触发器一并删除该人的tab_2中的数据

  2、在tab_1中新插入一个人员时,触发器在tab_2中一并新增一条该人的数据

  ===================================================================================

  所以在你建立触发器时,就要指定该触发器的用途,是同步更新,还是删除、插入,由你指定。

  基本的语法规则是:

  create trigger 触发器名称(你自己命名的) on 表 for 用途(delete|update|insert)

  as

  delete|update|insert语句

  ----------------------------------------------------------------------

  例如:

  create trigger tri_A on tab_1 FOR DELETE

  AS

  delete tab_2 from deleted where tab_2.id = deleted.id;

  意思是:在tab_1表上,建立触发器(tri_A),用于删除该表的数据时触发一个事务,什么事务呢?——删除tab_2中的该编号人员的记录。

  FOR INSERT、FOR UPDATE分别是建立用于“插入记录”、“更新数据”的触发器,例子里的FOR DELETE是用于触发“删除记录”的。

  这里还要看清楚,那个delete语句中的表,是from deleted哦,还有,where子句的tab_2.id = deleted.id,不是tab_2.id = tab_1.id哦,deleted.id是指你刚删除的那条记录的id(而update、insert,都用inserted.id)

  ===================================================================================

  好处:相对于外部程序、存储过程,触发器可以更快更高效的维护数据

  坏处:(我自己的经验)触发器要用的恰到好处,一个大型应用里,触发器越少越好,触发器会使编程时源码的结构被迫打乱,为将来的程序修改、源码阅读带来很大不便

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分