机房收费系统在做的时候看到有的人用到的触发器就想的用一下,可是总是往后拖,机房就快结束了也没有用到,于是就把退卡功能加入触发器重新实现了一下。
一、触发器概念
触发器是SQL Server 提供给程序员和数据分析员来保证数据完整性的一种方法,它与表事件相关的特殊的存储过程。
触发器不能被执行,只能为表上的Insert、Update、Delete事件所触发,顾名思义:某一操作发生则一触即发此操作。
二、触发器的使用
以机房收费中退卡为例:退卡时需要在T_CancelInfo表中插入一条数据,同时更新T_CardInfo中字段Cash和Status。
1.建立触发器:insert一条数据到T_CancelInfo引发update T_CardInfo中对应卡号的一条记录,因此是在T_CancelInfo表中新建触发器
2.SQL Server中代码编写,D层中不需要写代码
ALTER TRIGGER [dbo].[TriggerCard] ON [dbo].[T_CancelInfo] for insert AS BEGIN --声明变量 declare @CardNo char(12) --从Inserted虚拟表中得到CardNo赋值给参数 select @CardNo = CardNO from inserted begin --更新T_CardInfo表中数据 update T_CardInfo set Cash =0 ,Status ='不使用' where CardNo=@CardNo end END
[dbo].[TriggerCard]:触发器的名称
[dbo].[T_CancelInfo]:引发的此事件发生的表
for insert:T_CancelInfo的插入事件执行后才触发
select @CardNo = CardNO from inserted:从Insert T_CancelInfo 事件形成的逻表中获得字段CardNo给到参数@CardNo
借用一张图片说明Inserted和Deleted逻辑表:
三、优缺点
优点:
1.以事件方式来处理. 当数据发生变化的时候, 自动作处理。
2.开销非常低,运行触发器所占用的时间主要花在引用其他存于内存或磁盘上的表上。
3.只对每一个DML(增删改查)操作触发一次,无论它一共影响了多少行。
4.可以实现比Check约束更复杂的数据完整性,触发器可以引用其他表中的列来完成检查工作。
缺点:
当数据库之间导出导入的时候, 可能会引起不必要的触发逻辑,执行速度主要取决于数据库服务器的性能与触发器代码的复杂程度。
使用一次,设计不好可能会死机。
滥用触发器会造成数据库以及应用程序的维护困难,如果我们过分依赖触发器,一定会影响数据库的结构。
事物都有它的两面性,有利有弊,重要的是我们如何根据它的特点,让它的利发挥最大效益。