对触发器一词早有耳闻(最早是在耿大妈的数据库视频中),当初看完视频后,对理解不深刻的东西如:触发器,存储过程,事务,日志等等没有具体的去查阅,也没有具体的去尝试,应用。所以才导致了今天的博客(把曾经丢下的补上)。提到触发器一词,首先想到的是“触发器不能乱用”,“慎用触发器”,只是我们可不能把这些提醒的话,当成了自己不去尝试的借口。学习要有无知者无畏的精神,管他呢,先试了再说。
简介
- 概念:触发器是个特殊的存储过程(存储过程下篇博客中会讲到),它的运行不是由程序调用,也不是手工启动,而是由事件来触发,比方当对一个表进行操作(insert,delete, update)时就会激活它运行。触发器经经常使用于加强数据的完整性约束和业务规则等。
- 作用:主要作用就是能够实现由主外键所不能保证的,复杂的參照完整性和数据的一致性。另外触发器还能够通过数据库中的相关表实现级联更改,通货级联引用完整性约束能够更有效的运行这些更改。其次还有强化约束,跟踪变化,存储过程的调用等。当然还有其它非常多的功能,仅仅是如今尚未接触到而已,具体的内容请查看百科触发器 。
怎样使用
比起上面的基础知识,相信大家更关注的是详细怎么使用。以下以机房收费系统系统中的一个充值功能为例来说明触发器在系统中的详细应用。
- 首先想,想想在充值这个功能中哪个地方用到了触发器?在充值完毕后会保存一条记录到充值记录表中,这条记录中包括最新的剩余金额,同一时候还要把这个剩余金额更新到卡表中。即在运行insert操作的时候,触发条件去运行一个Update操作。
- 在SQL对应表中建立触发器。这个操作是在充值记录表中完毕的,所以触发器建立在该表中。详见下图:
- 加入对应触发器的代码:
-- ============================================= -- Author: 牛迁迁 -- Create date: 06/09/2014 15:32:21 -- Description: 当插入一条充值记录时,自己主动更新卡表中的剩余金额 -- ============================================= ALTER TRIGGER [dbo].[CardBalance] -- 触发器名称 ON [dbo].[Recharge_info] -- 触发器位置 FOR insert -- 表明期望触发器在何种动作类型下激活 AS declare @Balance varchar(8) -- declare @CID varchar(8) -- 声明參数 select @Balance = balance from Recharge_info -- 给參数赋值 select @CID = CID from Recharge_info -- BEGIN -- 运行触发器,更新卡表剩余金额 UPDATE Card_info set balance = @Balance where Card_info .CID = @CID END
- 执行结果查看:
充值记录表:
卡表:
慎用触发器:
触发器功能强大,轻松可靠地实现很多复杂的功能,为什么又要慎用呢。触发器本身没有过错,但滥用的话,将会造成数据库及应用程序的维护困难。假设我们对触发器过分的依赖,势必影响数据库的结构,同一时候添加了维护的复杂程度。所以触发器虽好,但使用的时候要斟酌一下,在合适的情况下使用。
做重构版的一个感受的就是代码量大大添加了。写个增删改查,建立实体,编写接口,D层,B层,U层,层层调用。所以我们更要想办法为代码减负,使代码精简、便于复用。
学习数据库技术是个良好的開始。
PS:关于触发器这篇博客介绍的比較具体可供大家学习:http://www.cnblogs.com/kissdodog/p/3173421.html