触发器是一种特殊的存储过程,不是用户直接调用,而是通过对表的一些操作触发的,比如对某个表的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表有数据(旧数据)
总结:虽然触发器,本人在实践中用得比较少,
但是个人认为,
前触发器用在对某个表操作前,进行一些逻辑处理和判断,从而判断是否对该表进行相应的操作。
后触发器用在对某个表操作后,进行操作自身和其他表。