码迷,mamicode.com
首页 > 其他好文 > 详细

After和Instead of触发器

时间:2015-04-15 13:41:08      阅读:186      评论:0      收藏:0      [点我收藏+]

标签:sql server   数据库   触发器   

l  After触发器:这类触发器是在记录已经改变完之后(after),才会被激活执行,它主要是用于记录变更后的处理或检查,一旦发现错误,也可以用Rollback Transaction语句来回滚本次的操作。

l  Instead Of触发器:这类触发器一般是用来取代原本的操作,在记录变更之前发生的,它并不去执行原来SQL语句里的操作(InsertUpdateDelete),而去执行触发器本身所定义的操作。

 After触发器的工作原理

 

After触发器是在记录更变完之后才被激活执行的。以删除记录为例:当SQL Server接收到一个要执行删除操作的SQL语句时,SQL Server先将要删除的记录存放在删除表里,然后把数据表里的记录删除,再激活After触发器,执行After触发器里的SQL语句。执行完毕之后,删除内存中的删除表,退出整个操作。

还是举上面的例子:在产品库存表里,如果要删除一条产品记录,在删除记录时,触发器可以检查该产品库存数量是否为零,如果不为零则取消删除操作。看一下数据库是怎么操作的:

1)接收SQL语句,将要从产品库存表里删除的产品记录取出来,放在删除表里。

2)从产品库存表里删除该产品记录。

3)从删除表里读出该产品的库存数量字段,判断是不是为零,如果为零的话,完成操作,从内存里清除删除表;如果不为零的话,用Rollback Transaction语句来回滚操作。

Instead Of触发器的工作原理

 

Instead Of触发器与After触发器不同。After触发器是在InsertUpdateDelete操作完成后才激活的,而Instead Of触发器,是在这些操作进行之前就激活了,并且不再去执行原来的SQL操作,而去运行触发器本身的SQL语句。

 

注意事项:

l  After触发器只能用于数据表中,Instead Of触发器可以用于数据表和视图上,但两种触发器都不可以建立在临时表上。

一个数据表可以有多个触发器,但是一个触发器只能对应一个表。

在同一个数据表中,对每个操作(如InsertUpdateDelete)而言可以建立许多个After触发器,但Instead Of触发器针对每个操作只有建立一个。

如果针对某个操作即设置了After触发器又设置了Instead Of触发器,那么Instead of触发器一定会激活,而After触发器就不一定会激活了。

l  Truncate Table语句虽然类似于Delete语句可以删除记录,但是它不能激活Delete类型的触发器。因为Truncate Table语句是不记入日志的。

l  WRITETEXT语句不能触发InsertUpdate型的触发器。

不同的SQL语句,可以触发同一个触发器,如InsertUpdate语句都可以激活同一个触发器。

 

 

 Instead Of触发器的使用范围

Instead Of触发器可以同时在数据表和视图中使用,通常在以下几种情况下,建议使用Instead Of触发器:

数据库里的数据禁止修改:例如电信部门的通话记录是不能修改的,一旦修改,则通话费用的计数将不正确。在这个时候,就可以用Instead Of触发器来跳过Update修改记录的SQL语句。

有可能要回滚修改的SQL语句:如11.5.3节中的例二,用After触发器并不是一个最好的方法,如果用Instead Of触发器,在判断折扣大于0.6时,就中止了更新操作,避免在修改数据之后再回滚操作,减少服务器负担。

在视图中使用触发器:因为After触发器不能在视图中使用,如果想在视图中使用触发器,就只能用Instead Of触发器。

用自己的方式去修改数据:如不满意SQL直接的修改数据的方式,可用Instead Of触发器来控制数据的修改方式和流程。

 

After和Instead of触发器

标签:sql server   数据库   触发器   

原文地址:http://blog.csdn.net/yayun0516/article/details/45056643

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!