SQL Server触发器见解
数组的运算法则1、触发器的定义
触发器(trigger)是个特殊的存储过程,它的执行不是由程序调用,也不是手工启动,而是由个事件来自动触发,比如当对一个表进行操作(insert/delete/update)时就会激活它执行。
2、触发器的分类
第一类:DML触发器:主要为insert/delete/update开头的语句创建触发器,触发对象——当前数据表或视图
mysql语句的执行顺序
1)After/for后触发器:在insert/delete/update操作完成之后,执行触发器
2)Instead of前触发器:不执行insert/delete/update操作,而是执行触发器
第二类:DDL触发器:主要为create/alter/drop开头的语句创建触发器,可用于管理任务。触发对象——当前数据库或服务器触发(sql2005新特点)
3、For/After/Instead of触发器的区别
AFTER指定触发器只有在触发SQL语句中指定的所有操作都已成功执行后才激发。所有的引用级联操作和约束检查也必须成功完成后,才能执行此触发器。如果仅指定FOR关键字,则AFTER是默认设置。不能在视图上定义AFTER触发器。
INSTEAD OF指定执行触发器而不是执行触发SQL语句,从而替代触发语句的操作。在表或视图上,每个INSERT、UPDATE或DELETE语句最多可以定义一个INSTEAD OF触发器。然而,可以在每个具有INSTEAD OF触发器的视图上定义视图。INSTEAD OF触发器不能在WITH CHECK OPTION的可更新视图上定义。如果向指定了WITH CHECK OPTION选项的可更新视图添加INSTEAD OF触发器,SQL Server将产生一个错误。用户必须用ALTER VIEW删除该选项后才能定义INSTEAD OF触发器。
注解:For触发器在底层数据被修改之前被触发;因此,如果需要的话,针对这部分操作可以用触发器来调用Rollback。After触发器只能建立在表上。
4、触发器的作用
通常用于保证业务规则和数据完整性,其主要优点是让用户可以用编程的方法来实现复杂的处理逻辑和业务规则
1)触发器是自动的:它们在对表的数据作了任何修改(比如手工输入或者应用程序采取的操作)之后立即被激活。
2)触发器完成比check约束更复杂的数据约束。
3)触发器可以实现复杂的业务规则,通过编写SQL语句实现。
4)为保证数据库性能而维护的非规范化数据。比如,为提高数据库的统计效率,每当在表中插入数据时,都使用触发器来统计某列的总值。
5、递归触发器
AFTER触发器不会以递归方式自行调用,除非设置了RECURSIVE_TRIGGERS 数据库选项。
有两种不同的递归方式:
sigpipe信号1)直接递归
在触发器触发并执行一个导致同一个触发器再次触发的操作时,将发生此递归。例如,应用程序更新了表T3,从而触发了触发器Trig3。Trig3再次更新表T3,从而再次触发了触发器Trig3。
在SQL Server2005中,调用其他类型的触发器(AFTER或INSTEAD OF)之后再次调用同一个触发器时,也会发生直接递归。换言之,当同一个INSTEAD OF触发器被第二次调用时,即使在这两次调
用之间调用了一个或多个AFTER触发器,也会发生INSTEAD OF触发器的直接递归。同样,当同一个AFTER触发器被第二次调用时,即使在这两次调用之间调用了一个或多个INSTEAD OF触发器,也会发生AFTER触发器的直接递归。例如,一个应用程序对表T4进行更新。此更新将导致触发INSTEAD OF触发器Trig4。Trig4对表T5进行更新。此更新将导致触发AFTER触发器Trig5。Trig5更新表T4,此更新将导致再次触发INSTEAD OF触发器Trig4。此事件链即被认为是Trig4的直接递归。
2)间接递归
当触发器触发并执行导致触发相同类型的其他触发器(AFTER或INSTEAD OF)的操作时,会发生此类递归。第二个触发器执行一个再次触发第一个触发器的操作。换言之,当在这两次调用之间调用其他INSTEAD OF触发器之前第二次调用INSTEAD OF触发器,便会发生间接递归。同样,当在这两次调用之间调用其他AFTER触发器之前第二次调用AFTER触发器,也会发生间接递归。例如,一个应用程序对表T1进行更新。此更新将导致触发AFTER触发器Trig1。Trig1更新表T2,此更新将导致触发AFTER触发器Trig2。Trig2反过来更新表T1,从而导致再次触发AFTER触发器Trig1。
当RECURSIVE_TRIGGERS数据库选项设置为OFF时,仅阻止AFTER触发器的直接递归。若要禁用AFTER触发器的间接递归,还必须将nested triggers 服务器选项设置为0。
6、嵌套触发器
当触发器执行启动其他触发器的操作时,DML和DDL触发器都是嵌套触发器。这些操作都可以启动其他触发器等。DML触发器和DDL触发器最多可以嵌套32层。可以通过nested triggers服务器配置选项来控制是否可以嵌套AFTER触发器。但不管此设置为何,都可以嵌套INSTEAD OF触发器(只有DML 触发器可以为INSTEAD OF触发器)。
注意:Transact-SQL触发器中对托管代码的任何引用均计为32层嵌套限制中的一层。从托管代码内部调用的方法不根据此限制进行计数。
如果允许使用嵌套触发器,且链中的一个触发器启动了一个无限循环,则将超出嵌套层限制,且触发器将终止。
注意:由于触发器在事务中执行,如果在一组嵌套触发器的任意层中发生错误,则整个事务都将取消,且所有的数据修改都将回滚。在触发器中包含PRINT 语句可以确定错误的发生位置。
7、取消触发器的嵌套
如果不想对触发器进行嵌套的话,可以通过【允许触发器激活其他触发器】的服务器配置选项来控制。但不管此设置是什么,都可以嵌套Instead Of触发器。设置触发器嵌套的选项更改方法为:
1)打开Management Studio,在【对象资源管理】中,右击服务器名,并选择【属性】选项。
2)单击【高级】节点。
3)在【杂项】里设置【允许触发器激活其他触发器】为True或False。
若要禁用嵌套触发器,请用sp_configure将nested triggers选项设置为0(关闭)。默认配置允许嵌套触发器。如果嵌套触发器是关闭的,则也将禁用递归触发器,与sp_dboption的recursive triggers设置无关。且只能针对所有表进行禁用。示例:vimeo app中文安卓
create procedure p
as
exec sp_configure'nested triggers','0'
reconfigure with override
go
8、指定第一个和最后一个触发器
可将与表相关联的AFTER触发器之一指定为每个INSERT、DELETE和UPDATE触发动作执行的第一
个或最后一个AFTER触发器。在第一个和最后一个触发器之间激发的AFTER触发器将按未定义的顺序执行。
若要指定AFTER触发器的顺序,请使用sp_settriggerorder存储过程。可用的选项有:
1)第一个:指定该触发器是为触发操作激发的第一个AFTER触发器。
2)最后一个:指定该触发器是为触发操作激发的最后一个AFTER触发器。
3)无:指定触发器的激发没有特定的顺序。主要用于重新设置第一个或最后一个触发器。
使用sp_settriggerorder的示例:
sp_settriggerorder@triggername='MyTrigger',@order='first', @stmttype='UPDATE'
重要提示:第一个和最后一个触发器必须是两个不同的触发器。
可能同时在表上定义了INSERT、UPDATE和DELETE触发器。每种语句类型可能都有自己的第一个和最后一个触发器,但它们不能是相同的触发器。
如果为某个表定义的第一个或最后一个触发器不包括触发操作,如FOR UPDATE、FOR DELETE或F
OR INSERT,则缺少的操作将没有第一个或最后一个触发器。
不能将INSTEAD OF触发器指定为第一个或最后一个触发器。在对基础表进行更新前激发INSTEAD OF触发器。然而,如果由INSTEAD OF触发器对基础表进行更新,则这些更新将发生于在表上定义触发器(包括第一个触发器)之后。例如,如果视图上的INSTEAD OF触发器更新基表并且该基表包含三个触发器,则该三个触发器在INSTEAD OF触发器插入数据之前激发。有关更多信息,请参见指定触发器何时激发。
如果ALTER TRIGGER语句更改了第一个或最后一个触发器,则将除去First或Last特性,并且顺序值将设置为None;必须用sp_settriggerorder 重置此顺序。
OBJECTPROPERTY函数使用属性ExecIsFirstTrigger和ExecIsLastTrigger报告触发器的顺序是第一个还是最后一个。
复制将为本身是即时更新订户或排队更新订户的任何表自动生成第一个触发器。复制要求它的触发器是第一个触发器。如果尝试使具有第一个触发器的表成为即时更新订户或排队更新订户,复制将引发错误。如果使表成为即时更新订户或排队更新订户之后使用户定义触发器成为第一个触发器,则sp_settriggerorder会返回一个错误。如果在复制触发器上使用ALTER,或使用sp_settriggerorder将复制触发器更改为最后触发器或无触发器,则订阅将不能正确工作。
扁钢和钢板有什么区别
9、关闭Delete触发器
有一条语句可以停止对Delete触发器的触发。如果调用TRUNCATE TABLE T-SQL命令。它会删除表中的数据,而不生成任何日志文件。这也就意味着Delete 触发器不会被触发,因为本质上发生的并不是删除操作。
、启用及关闭触发器
1010、启用及关闭触发器
触发器一经创建就已启用,在指定时刻自动执行,管理人员可以通过T-SQL 语句启用及关闭触发器,如下:
ALTER TABLE Delivery disable TRIGGER eb_tg_CheckDeliverCompany
以上语句的功能是关闭触发器,若要启动触发器,请将disable改为enable,它后面也可使用“TRIGGER ALL”,表示启用或关闭全部触发器如果需要临时关闭下触发器,但不影响其它人使用该触发器。应该先对这条数据上锁,然后关闭触发器,示例:
begin tran
select top1*from ttt with(TABLOCKX)培训机构还能开吗
禁用触发器
更新操作
激活触发器
Commit

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。