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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值