机房重构中,有很多功能的实现涉及到对数据库中多张表进行操作。比方说结账,结账成功之后实现的功能有: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='不使用'
总结:
之前学习数据库的时候,了解了触发器。当时没有去应用这个知识,重构中用到了才发现它的功能是如此之强大。果然,实践出真知。