关于触发器

http://qsfwy.iteye.com/category/35969

触发器是一种特殊的存储过程,它不能被显式地调用,而是在往表中插入记录、更改记录或者删除记录时,当事件发生时,才被自动地激活。也就是对某一个表的一定的操作,触发某种条件,从而执行的一段程序。

基本语句如下﹕        

           create trigger trigger_name

           on {table_name | view_name}

           {for | After | Instead of }

           [ insert, update,delete ]

           as

           sql_statement

有insert,update,delete三种触发器。for 和after :同义(更准确的说用for时默认的是after)。

After 在触发事件发生以后才被触发,只可以建立在表上。

Instead of 代替了相应的触发事件而被执行,既可以建立在表上也可以建立在视图上。

当触发DELETE触发器后,从受影响的表中删除的行将被放置到一个特殊的deleted表中。deleted表是一个逻辑表,它保留已被删除数据行的一个副本。

当触发INSERT触发器后,新的数据行就会被插入到inserted表中。inserted表是一个逻辑表,它包含了已经插入的数据行的一个副本。

当触发UPDATE触发器后,(可以看成是先删除后添加)被删除的原始行被移入deleted表中,被添加的更新后的行被移入inserted表中。

 

下面我们利用delete触发器实现一个级联删除(当删除一个学生后连他的成绩也一并删除):

create trigger Stu_src

on student

after delete

as

delete from score where sid in (select id from deleted)

 

设置某触发器可用或不可用

alter table 表名

disable trigger 触发器名

alter table 表名

enable trigger 触发器名

删除某触发器

drop trigger 触发器名

 

我们再来举例说明一下操作时机为instead of的触发器,只是举例子,一般不会这么写触发器(更新一个学生时检查其更新的学号是否为0701110123,是的话只更新该学号,不是的话事务回滚):

create trigger Stu

on student

instead of update

as

declare @afterlearnid varchar(50)

declare @beforelearnid varchar(50)

set @afterlearnid=(select learnid from inserted)

set @beforelearnid=(select learnid from deleted)

if @afterlearnid='0701110123'

update student set learnid=@afterlearnid where learnid=@beforelearnid

else

rollback transaction

如果按一般的理解 Instead of 代替了相应的触发事件而被执行,我们会想如果没有执行触发事件(这里是更新)肯定deleted,inserted表里没有东西,但其实它们里面是有东西的,而且该怎么样还是怎么样,但要知道deleted,inserted表只是逻辑表,所以跟影响的实表没关系。

update student set learnid='0701110123',sname='六六六' where learnid='0701110122'

这里满足触发器里的学号要求,但从最后的结果中可以看出确实是触发器中的语句代替了这条语句,因为我们在语句中更新了学生名字,但实际上没有更新,因为触发器中的语句没有更新学生名字。

 

虽说操作时机为after的触发器是在触发事件执行后而被执行的,但仍然能在触发器中执行事务回滚致使触发事件(执行的语句)无效:

create trigger updatestu

on student

after update

as

if update(sname)

rollback transaction

 

if update (col_name):表明所作的操作对指定列是否有影响,有影响,则激活触发器。

update student set learnid='0701110123',sname='六六六' where learnid='0701110128'这里对sname有更新,所以会激活触发器执行事务回滚。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值