不过这次敲个人版机房收费系统,自己实际去运用了一下触发器,感觉它太给力了,节省了很多不必要的代码了,减轻了系统的负担。还节省了很多时间。真是既省时又省力。
废话不多说了,接下来在简单唠叨几句什么是触发器,触发器的好处以及注意事项和自己在机房时所用的触发器实例。
触发器(trigger)是SQL server 提供给程序员和数据分析员来保证数据完整性的一种方法,它是与表事件相关的特殊的存储过程,
它的执行不是由程序调用,也不是手工启动,而是由事件来触发,当对一个表进行操作( insert,delete, update)时就会激活它执行。
好处:触发器可通过数据库中的相关表实现级联更改,不过,通过级联引用完整性约束可以更有效地执行这些更改。
触发器可以强制比用CHECK约束定义的约束更为复杂的约束。与 CHECK 约束不同,触发器可以引用其它表中的列。
注意事项:触发器功能强大,轻松可靠地实现许多复杂的功能,为什么又要慎用呢。触发器本身没有过错,
但由于我们的滥用会造成数据库及应用程序的维护困难。在数据库操作中,我们可以通过关系、触发器、存储过程、
应用程序等来实现数据操作…… 同时规则、约束、缺省值也是保证数据完整性的重要保障。如果我们对触发器过分的依赖,
势必影响数据库的结构,同时增加了维护的复杂程度。
更详细的解释大家可以到http://baike.baidu.com/subview/71792/6320022.htm
在简单说一下CHECK 约束:指定可由表中一列或多列接受的数据值或格式。
例如,可以要求 student 表的 stuID 列只允许输入11位数的数字。
实例:学生下机
学生下机后的余额=学生上机前的金额—消费的金额
如果不使用触发器的话,我们在更新消费表的同时,还要编写更新卡表中金额代码。这样编写起来做的都是无用功。又费时又费力。
如果用触发器就不一样了,几行代码就把卡表中的数据跟新了。
ALTER TRIGGER [dbo].[_upCardCash] --触发器名称
on [dbo].[T_Consumeinfo] --作用的表
for Update --触发的事件
AS
BEGIN
declare @ID as bigint --卡号
declare @CardCash decimal(18,1) --金额
--查找消费表中的余额与卡号。其中Deleted是临时表,里面的数据是没更新之前旧的数据,
--而Inserted也是一个临时表,它里面的数据是更新之后新的数据
--当旧数据与新数据中CardCash不相同时,更新表T_Cardinfo
select @CardCash=i.CardCash,@ID=i.StuID from T_Consumeinfo c,deleted d, inserted i where d.CardCash != i.CardCash
--更新卡表
UPDATE T_Cardinfo SET CardCash=@CardCash WHERE StuID=@ID
END
在触发器的中,如果查询表中的数据没有条件限制,触发器默认是数据表中的最后一行。(数据库默认排序方式是主键从小到大)
例如:学生充值
ALTER TRIGGER [dbo].[stu_Recharge]
ON [dbo].[T_Rechargeinfo]
for insert
AS
BEGIN
declare @Balance decimal(18,1) --余额
declare @ID as bigint
declare @CardCash decimal(18,1) --充值金额
select @CardCash =Cardcash,@ID=StuID From T_Rechargeinfo --查找充值表中的最后一行的数据的充值金额与卡号
select @Balance=CardCash from T_Cardinfo where StuID=@ID --查询卡表中的金额
set @balance=@Balance+@CardCash --总金额
SET NOCOUNT ON;--返回的行数,no为不返回。
UPDATE T_Cardinfo set CardCash =@Balance Where StuID =@ID --更新
END
以上是我对触发器的理解。哪里有不对的地方请大家指出来,在下面留言即可。谢谢。