触发器判断插入、删除和更新操作

测试环境:MS SQL Server 2005

创建触发器的简单语句:

CREATE TRIGGER triggerName   ON  tableName AFTER/FOR  INSERT,DELETE,UPDATE AS

其中insert是插入操作,delete是删除操作,update是更新操作,这三个操作是可选的。有时候我们需要根据不同的操作执行不同的方法,这就需要判断当前的操作是insert,update,还是delete。

可以根据触发器维持的两个表的状态来判断:Inserted表和Deleted。这是两个临时表(也可以说是虚拟表),当执行不同的操作时,它们有不同的数据状态:

一、插入操作(INSERT)时:Inserted表有数据,Deleted表无数据 。
二、删除操作(DELETE)时:Inserted表无数据,Deleted表有数据 。
三、更新操作(UPDATE)时:Inserted表有数据(新数据),Deleted表有数据(旧数据) 。

所以判断是否insert可以这样子:

if exists(select * from INSERTED)--如果INSERTED表里面存在数据,那么就是insert了
begin
......
end
--或者
if not exists(select * from DELETED)--如果DELETED表里面不存在数据
begin
......
end 

判断删除:

if exists(select * from DELETED)
begin
--或者
if not exists(select * from INSERTED)
begin
......
end 
判断更新,更新的时候,两个表里面都有数据,所以:
if(select count(*) from DELETED)>0 and (select count(*) from INSERTED)>0--两个表的数据数量都大于0
begin
......
end
--或者
if exists(select * from INSERTED) and  exists(select * from DELETED
begin 
......
上面的 这个更新跟当指定的表一有更新就触发,也可以指定某个字段更新时触发,如:
if update(field)--必须加括号,否则会报错
begin
......
end 
这个begin,end有点类似常用的{},有分支判断还是加上比较好,免得乱的自己都看不懂。
判断更新,更新的时候,两个表里面都有数据,所以:
if(select count(*) from DELETED)>0 and (select count(*) from INSERTED)>0--两个表的数据数量都大于0
begin
......
end
--或者
if exists(select * from INSERTED) and  exists(select * from DELETED
begin 
......
上面的 这个更新跟当指定的表一有更新就触发,也可以指定某个字段更新时触发,如:
if update(field)--必须加括号,否则会报错
begin
......
end 
这个begin,end有点类似常用的{},有分支判断还是加上比较好,免得乱的自己都看不懂。

猜你喜欢

转载自1017401036.iteye.com/blog/2101080
今日推荐