关于触发器的理解

触发器是一种特殊的存储过程,不是用户直接调用,而是通过对表的一些操作触发的,比如对某个表的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表有数据(旧数据)

 

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

但是个人认为,

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

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

 

                              

posted @ 2010-01-06 13:48  桑叶舟  阅读(898)  评论(0编辑  收藏  举报