您的位置:首页 > 其它

关于触发器的理解

2011-04-27 12:59 375 查看
触发器是一种特殊的存储过程,不是用户直接调用,而是通过对表的一些操作触发的,比如对某个表的insert,update,delete,如果我们在该表中定义了相应的触发器,那么触发器就会执行。

在SQL SERVER中,触发器分为两种,一是前触发器(instead of),另一种是后触发器(after or for).

它们的区别在于:

前触发器(instead of) 顾名思意,就是代替引起触发的操作,而去执行触发器里面定义的脚本.

例如:

定义表:create talbe a(id int,name varchar(20),create table b(id int,name varchar(20).

定义触发器:create trigger tri_a

on a instead of insert

as

begin

insert into b select * from inserted

end

当我们执行 insert into a (id,name) values (1,'abc) 的时候,该语句就触发了定义在表的触发器,从而执行insert into b

select * from inserted ,而不去执行插入表a的操作。其中inserted是个虚拟表,存放在内存中,下面会有详细介绍。

后触发器(after or for),是指对表执行了insert,update,delete后,触发定义在表的触发器,执行触发器的脚本。

例如:

定义表:create table products(proid int identity(1,1),proname varchar(20),procount int ,unitprice decimal ,totalprice decimal )

定义触发器:create trigger computeTotalprice

on products for insert

as

begin

update products

set totalprice = procount * unitprice

where proname in (select proname form inserted)

end

当我们执行 insert into products (proname,procount,unitprice) values ('FOOD',10,4.5)后,就会触发定义在products表的触发器,该触发器是计算该商品的总价。

在以上的触发器的脚本中都用到了虚拟表,inserted,但是还有另一虚拟表deleted,下面总结这两个表的用途:

1.插入操作(Insert)

Inserted表有数据,Deleted表无数据

2.删除操作(Delete)

Inserted表无数据,Deleted表有数据

3.更新操作(Update)

Inserted表有数据(新数据),Deleted表有数据(旧数据)

总结:虽然触发器,本人在实践中用得比较少,

但是个人认为,

前触发器用在对某个表操作前,进行一些逻辑处理和判断,从而判断是否对该表进行相应的操作。

后触发器用在对某个表操作后,进行操作自身和其他表。

原文地址:/article/5469760.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: