前几天刚刚学了sql server 2005,在学到trigger 时知道怎样创建insert,delete,update触发器;觉得触发器在保护表中数据有很大的作用,当时我在想为表创建三个触发器太麻烦,如果能把三个触发器的功能写在一个触发器中不久很省事么?我就试着写这样一个触发器,但是想了很久都没有成功,问题处在在触发器中怎样判断对表进行了什么操作(insert,update,delete)以便于激发不同的处理,通过看书在论坛发帖子,经过一天多的努力终于搞定了。
create table anclass (
picname nvarchar(20),
picurl nvarchar(20)
)
go
create table nclass
(
picname nvarchar(20),
title nvarchar(20)
)
insert into anclass values('部门1','100人')
go
insert into anclass values('部门2','200人')
go
insert into anclass values('部门3','300人')
go
insert into nclass values('部门1','logo1')
go
insert into nclass values('部门1','logo11')
go
insert into nclass values('部门1','logo111')
go
insert into nclass values('部门2','logo2')
go
insert into nclass values('部门3','logo3')
select * from anclass
go
select * from nclass
create trigger tri_anclass
on anclass
for insert,update,delete
as
declare @count1 int --声明两个整型变量作统计
declare @count2 int
declare @update_later nvarchar(10)
declare @update_before nvarchar(10)
begin
set @count1 = 0 --为变量赋初值
set @count2 = 0
select @count1 = count(*) from inserted --统计inserted表中的记录数
select @count2 = count(*) from deleted --统计deleted表中的记录数
/*因为是after触发器,它是在记录变更后才被激活的,根据insert,delete和update
操作后两张表(inserted,deleted)中记录数的变化来判断对表进行了哪种操作,从而匹配不同的
处理函数*/
if(@count1 > 0 and @count2 = 0) --insert操作
begin
print 'One line was inserted.'
end
if(@count1 = 0 and @count2 > 0) --delete操作
begin
delete from nclass where picname in (select picname from deleted)
end
if(@count1 = 1 and @count2 = 1) --update操作
select @update_later = picname from inserted
select @update_before = picname from deleted
begin
update nclass set picname = @update_later where picname = @update_before
end
end
触发器的测试:update anclass set picname='doudou' where picname='部门1'
update anclass set picurl='101人' where picurl='100人'
delete from anclass where picname='部门3'
在执行after触发器时 inserted表和deleted表中的数据的变化和保存的数容 如下(个人理解)insert操作时 inserted表中有数据,保存的要插入的记录,deleted表中没有数据。delete操作时inserted表中没有数据deleted表中有数据,保存的是删除以后的记录,update操作时inserted和deleted表中都有数据,inserted中存放的是更新以后的数据,deleted中存放的是更新以前的数据,这样就可以更具这两张表中的记录数来判断在数据库操作时对表进行了什么操作(insert,delete,update)