学习中进步,进步中学习 初学触发器的小小收获

前几天刚刚学了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)                                                

阅读更多
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭