SQL之触发器

/*触发器是一种不带参数特殊的存储过程,有用户定义,数据库系统根据一定的条件自动执行*/
  --SQL触发器大体上可以分为4种]
  --insert 触发器:在对表进行数据录入的时候触发
  --delete 触发器:删除表中的数据的时候触发
  --instead of 触发器:此类触发器创建在视图之上,用来替代相应的动作,比如delete,insert,update
  --触发器的内部可以使用commit和rollback
  
  create table emp
  (
  eid int primary key,
  ename varchar(10),
  sal money
  )
  
  create trigger in_tr
  on emp for insert
  as
  begin
   if (user='dbo')
   begin
   print 'dbo不能录入数据'
   rollback tran
   end
  end
  insert into emp values(1001,'rose',456)
  --触发器的触发发生在事件发生之后
  --在触发器中添加临时表可记录操作
  --在连接符union的各语句只触发一次
  --采用union对数据库的资源有利
  --触发器的主要功能:对历史数据的审计
  --语句级触发器:每语句触发;行级触发器:每改变一行触发
  
  /*inserted逻辑表*/
  /*作用:insert动作发生的时候,数据首先会被放入此表中接着等待用户的命令,
  如果用户回退事务,则清空此表的内容,如果用户提交事务,则把此表的数据永久写入数据库
  */
  --逻辑表的结构和触发器表的结构完全相同,存在与内存中
  select * into new from emp where 1>2
  --触发器中:
  create trigger in_tr
  on emp for insert
  as
  begin
   if (user='dbo')
   begin
   print 'dbo不能录入数据'
   rollback tran
   insert into new select * from inserted
   end
  end
  insert into emp values(1001,'rose',456)
  --逻辑表的数据将录入new
  --用于记录用户插入影响的行数以及数据,是否用union都会记录正确
  --各种约束优先于触发器
  /*逻辑表deleted,当delete动作发生的时候,要删除的数据首先会被放在deleted逻辑表中,
  接着等待用户提交或者回退的命令,如果用户提交,则清空deleted逻辑表中的数据,如果
  用户回退,则把deleted逻辑表的数据放回原地,以保证数据的一致性
  */
  alter trigger del_tr
  on emp for delete
  as
  begin
   if (user='dbo')
   begin
   print 'dbo不能录入数据'
   rollback tran
   end
   insert into new select * from deleted
  end
  delete from emp
  /*一个表可以创建多个不同类型的触发器,也可以创建多个同类型的触发器,
  但当一个表上存在多个相同类型的触发器的时候,触发器的执行顺序没有定义*/
  
  
  /*update动作发生的时候,将要被更新的数据(历史数据)首先被放在inserted逻辑表中,
  接着数据库系统等待用户提交或者回退的命令,如果用户提交,则清空deleted逻辑表中
  的数据,把inserted逻辑表中的数据放回原地,update涉及到两张逻辑表
  逻辑表的结构与触发器的结构完全相同
  */
  
  /*instead of 触发器*/
  create view v
  as select * from emp
  create trigger tr_v_insert
  on v instead of insert
  as
  begin
   print'录入数据'
  end
  --视图上的此触发器出发之后,基表上的触发器不再执行
  create trigger tr
  on emp for insert
  as
  begin
   print 'insert'
  end
  在instead of触发器中可以使用逻辑表
  
  --示例
  create table goods
  (
  gid int primary key,
  price money,
  )
  create trigger tr
  on goods for update
  as
  begin
   if (update(gid))
   begin
   print'主键不能更新!'
   rollback
   end
   if (update(price))
   begin
   print'价格可以更新'
   commit
   end
  end
  update goods set gid=1001
 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值