测试环境: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有点类似常用的{},有分支判断还是加上比较好,免得乱的自己都看不懂。