【机房收费系统】之触发器的使用

    机房重构中,有很多功能的实现涉及到对数据库中多张表进行操作。比方说结账,结账成功之后实现的功能有:1、修改卡表的结账状态。2、修改充值表的结账状态。3、修改退卡表的结账状态。4、删除卡表中不使用并且已结账的卡的信息。实现这些功能并不难,只要在D层中重新定义这些方法就OK了,但是这样的效率并不高。有没有一种既能实现这些功能又很高效的方法呢?这就涉及到对数据库中触发器的使用了。

    触发器

  一﹕ 触发器是一种特殊的存储过程,它不能被显式地调用,而是在往表中插入记录、更新记录或者删除记录时被自动地激活。所以触发器可以用来实现对表实施复杂的完整性约束。


  二﹕ SQL Server为每个触发器都创建了两个专用表﹕Inserted表和Deleted表。这两个表由系统来维护﹐它们存在于内存中而不是在数据库中。这两个表的结构总是与被该触发器作用的表的结构相同。触发器执行 完成后﹐与该触发器相关的这两个表也被删除。 Deleted表存放由于执行Delete或Update语句而要从表中删除的所有行。Inserted表存放由于执行Insert或Update语句而要向表中插入的所有行。


  三﹕
常见的触发器有两种:after(for)、instead of,用于insert、update、delete事件。after(for) 表示执行代码后,执行触发器;instead of 表示执行代码前,用已经写好的触发器代替你的操作。

    四:语法   

  create trigger 触发器的名字   on 操作表

  for|after         instead of

  update|insert|delete

  as

  SQL语句
        下面是针对结账的功能自己写的一个触发器,它不仅能帮助我实现功能,也能避免在D层中写过多的代码!

    应用:

CREATE TRIGGER triggerc_UpdateB
on Card_info  after 
update 
as 
if update ([ICheck])
 update ReturnCard_info set ICheck='已结账'where ICheck='未结账' and UserID=(select top 1  UserID from  INSERTED )
 update Recharge_info set ICheck='已结账'where ICheck='未结账' and UserID=(select top 1  UserID from  INSERTED )
 delete from Card_info where ICheck='已结账' and UState='不使用'

   总结:

  之前学习数据库的时候,了解了触发器。当时没有去应用这个知识,重构中用到了才发现它的功能是如此之强大。果然,实践出真知。




评论 39
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值