数据库-- 触发器

触发器是特殊的存储过程,它的执行不由程序调用,也不是手动启动,而是由事件来触发,比如当对一个表进行操作(INSERT、UPDATE、DELETE等,不包括SEARCH)时就会被激活,从而执行。另外一个与存储过程不同的地方在于,存储过程更多的是为了返回数据,而触发器更多的作用是维护数据完整性。所以触发器经常用于加强数据的完整性约束和业务规则等。
触发器有三种常规的类型:DML触发器、DDL触发器和登陆触发器。
 
DDL触发器:当服务器或数据库中发生数据定义语言(DDL)事件时会调用DDL触发器。
登陆触发器:为响应LOGON事件而激发存储过程。
DML触发器:当数据库发生数据操作语言(DML)事件时调用DML触发器,DML事件包括在指定表或者视图中修改数据的INSERT语句、UPDATE语句或者是DELETE语句。DML触发器可以查询其他表,还可以包含复杂的语句。可以将触发器和触发它的语句作为可在触发器内回滚的单个事务对待,如果检测到错误,事务即回滚。
 
在触发器的应用中,我们通常会用到两张表:deleted表inserted表。它们存储于高速缓存中,针对当前触发器的局部表,与触发器所在表的结构相同。当触发DELETE触发器时,从受影响的表中删除的数据行的副本将被放置到deleted表中。同理,当触发INSERTED触发器时,inserted表中保存刚被插入的数据行的副本。
 
触发器可以嵌套执行,当一个触发器执行触发另一个触发器的执行时,是可以发生嵌套的。最多可嵌套32层。
 
DML触发器的主要优点在于:它们能在包含代码的复杂处理逻辑。DML触发器可以支持约束的所有功能,但是DML触发器给于给定功能并非是最好的方法。预编译,已优化,执行效率高,避免了SQL语句在网络传输然后再解释的低效率。可以重复使用,减少开发人员的工作量。业务逻辑封装性较好。安全,不会出现SQL语句注入问题。
实体完整性应该是在最低级别上通过索引进行强制,这些索引应是PRIMARY KEY和UNIQUE约束的一部分,或者是独立于约束而创建的。域完整性应通过CHECK约束进行强制,而引用完整性(RI)则应通过FOREING KEY约束进行强制。但是在约束支持的功能无法满足应用程序的功能要求时,DML触发器非常有用。
 
缺点:触发器占有较多的资源,对服务器的压力大。触发器排除困难,而且数据容易造成不一样,后期维护不方便。此外,触发器有一个较大的缺点在于:触发器是后置触发,总是在事情发生之后才执行补救措施。而存储过程中如果逻辑构造合理便可以避免这个问题。
 
 
DML触发器:可通过数据库中的相关表实现级联更改。DML触发器可以防止恶意或错误的操作,并强制执行比CHECK约束定义的限制更为复杂的其他限制。与CHECK约束不同的是,DML触发器可以引用其他表中的列。
DML触发器有三种类型:AFTER触发器(在执行完语句操作后之后执行,只能在表上指定)、INSTEAD OF触发器(执行INSTEAD OF触发器代替通常的触发动作,支持视图操作)、CLR触发器(CLR触发器可以是AFTER触发器或INSTEAD OF触发器。CLR触发器还是触发器,CLR触发器将执行在托管代码中编写的方法,而不用执行存储过程)。
AFTER触发器和INSTEAD OF触发器的区别:1、INSTEAD OF触发器代替执行DML语句的触发操作。还可以对视图触发。2、在执行语句操作之后执行AFTER触发器。我们多采用AFTER触发器。
 
创建DML触发器:
CREATE TRIGGER 触发器名    
ON 表名 或 视图名
WITH ENCRYPTION  --    加密的选项
(FOR  |  AFTER  |  INSTEAD OF ){ [DELETE] [,] [INSERT] [,]  [UPDATE] }
AS
SQL 处理语言
 
示例:
技术分享
 
示例:检测表插入数据时提醒
技术分享
 
删除触发器: drop trigger 触发器名
 
触发器嵌套:
技术分享
 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。