对触发器一词早有耳闻(最早是在耿大妈的数据库视频中),当初看完视频后,对理解不深刻的东西如:触发器,存储过程,事务,日志等等没有具体的去查阅,也没有具体的去尝试,应用。所以才导致了今天的博客(把曾经丢下的补上)。提到触发器一词,首先想到的是“触发器不能乱用”,“慎用触发器”,只是我们可不能把这些提醒的话,当成了自己不去尝试的借口。学习要有无知者无畏的精神,管他呢,先试了再说。

简介

  1. 概念:触发器是个特殊的存储过程(存储过程下篇博客中会讲到),它的运行不是由程序调用,也不是手工启动,而是由事件来触发,比方当对一个表进行操作(insert,delete, update)时就会激活它运行。触发器经经常使用于加强数据的完整性约束和业务规则等。
  1. 作用:主要作用就是能够实现由主外键所不能保证的,复杂的參照完整性和数据的一致性。另外触发器还能够通过数据库中的相关表实现级联更改,通货级联引用完整性约束能够更有效的运行这些更改。其次还有强化约束,跟踪变化,存储过程的调用等。当然还有其它非常多的功能,仅仅是如今尚未接触到而已,具体的内容请查看百科触发器
    。

怎样使用

比起上面的基础知识,相信大家更关注的是详细怎么使用。以下以机房收费系统系统中的一个充值功能为例来说明触发器在系统中的详细应用。

  1. 首先想,想想在充值这个功能中哪个地方用到了触发器?在充值完毕后会保存一条记录到充值记录表中,这条记录中包括最新的剩余金额,同一时候还要把这个剩余金额更新到卡表中。即在运行insert操作的时候,触发条件去运行一个Update操作。
  2. 在SQL对应表中建立触发器。这个操作是在充值记录表中完毕的,所以触发器建立在该表中。详见下图:

  1. 加入对应触发器的代码:
-- =============================================
-- 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
  1. 执行结果查看:

充值记录表:

卡表:

慎用触发器:

触发器功能强大,轻松可靠地实现很多复杂的功能,为什么又要慎用呢。触发器本身没有过错,但滥用的话,将会造成数据库及应用程序的维护困难。假设我们对触发器过分的依赖,势必影响数据库的结构,同一时候添加了维护的复杂程度。所以触发器虽好,但使用的时候要斟酌一下,在合适的情况下使用。

做重构版的一个感受的就是代码量大大添加了。写个增删改查,建立实体,编写接口,D层,B层,U层,层层调用。所以我们更要想办法为代码减负,使代码精简、便于复用。

学习数据库技术是个良好的開始。

PS:关于触发器这篇博客介绍的比較具体可供大家学习:http://www.cnblogs.com/kissdodog/p/3173421.html

为代码减负之<一>触发器(SQL)的更多相关文章

  1. 为代码减负之<二>存储过程(SQL)

    在上篇博客中介绍到了触发器的使用,而且当中也提到了触发器是个特殊的存储过程,那么什么是存储过程呢?他们 两个又究竟有什么差别呢? 事实上最基本的差别就是,触发器是当满足条件时系统自己主动运行的,而存储 ...

  2. C#代码中设置 控件的触发器

    Style style = new Style(); style.TargetType = typeof(TextBox); MultiDataTrigger trigger = new MultiD ...

  3. 为代码减负之<三>视图(SQL)

    在设计数据库时为了降低数据冗余.一般都会依照三范式去设计,但有时我们在查询时须要通过一字段获取跟这 个字段相关联的好几个字段.可是他们又分布在不同的表中,这时候假设依照正常途径走的话须要同一时候查询好 ...

  4. SQL Server 为代码减负之存储过程

        存储过程能够用来提高数据库的查询效率.由于它事先被编译过.被储存于内存中,每次执行前.不必被从新编译,所以效率非常高. 存储过程是一组sql增删改查的集合,假设程序中的一个功能涉及到对数据库的 ...

  5. MySQL 代码开发注意事项----开发高性能的sql

    序言 一个服务或者一个程序,由 程序+数据组成.在数据这块,计算机中IO是比CPU要慢得多,为了减少IO,减少CPU运算.我们第一时间会想到索引,但索引为啥会提高效率,因为可以减少IO,在查询的时候不 ...

  6. 安卓开发学习历程1——《第一行代码》coolweather项目setOnItemClickListener函数,Sql语句修改对模拟app程序机影响

    今天,将<第一行代码>最后实战的coolweather项目,认真做了一遍. 今晚,在书中第一阶段开发代码认眞在Android studio敲完,发现setOnItemClickListen ...

  7. [转载代码]VB.NET 中查询 Linq to SQL 执行时的SQL语句

    在搜索使用LINQ TO SQL 添加数据后获得自增长ID的方法时,发现C#可以使用DebuggerWritter把使用Linq to SQL执行的SQL语句显示到即时窗口,于是在网上搜索到在VB.N ...

  8. 如何在c#代码中执行带GO语句的SQL文件

      需要在C#代码中执行一个SQL文件的内容.遇到了两个问题: 1. 因为SQL文件中有"GO"语句,执行时报错"Incorrect syntax near 'GO'.& ...

  9. Oracle生成多表触发器sql

    --将所有HY开头的表都生成一个更新触发器的脚本('/'是为了连续创建多个触发器而不报错)select 'CREATE OR REPLACE TRIGGER '||table_name||' BEFO ...

随机推荐

  1. Android - 支持不同的设备 - 支持不同的屏幕

    Android整体上按照两大类来分类设备屏幕:尺寸和分辨率.app在设备上运行应该考虑大小和分辨率.同样的,你应该包含不同的资源来让app适应不同的屏幕大小和分辨率. 整体上有四种尺寸:小的,正常的, ...

  2. sql 添加用户

    use master GO EXEC sp_addlogin 'infos1', '1', 'master' exec sp_grantdbaccess 'infos311' -- 给访问权限 USE ...

  3. 输入n个数和输出调整后的n个数

    输入n个数和输出调整后的n个数 Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 148  Solved: 118 [Submit][Status][We ...

  4. linux input如何固定设备event handler

    于qt开发时间.遇到的问题,usb输入设备(鼠标器,usb 电容屏)在动力分配后自己主动input节点,实例usb鼠标停留电后,分配给自己的主动性/dev/input/event0 mouse0.第一 ...

  5. or1200下Raw-OS学习(例子篇)

    没有图我说个~毛(J)线(B)~对吧??? 直接上一个以前做过的项目来说说怎么去从一个前后台的程序过度到利用操作系统去管理的你代码吧~以前想过直接用事件驱动的框架去编写代码的,无奈这方面的资料实在太少 ...

  6. ServletContext加入和访问

    (1)关于ServletContext认识: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveGxnZW4xNTczODc=/font/5a6L5L2T/f ...

  7. 基于docker构建jenkins和svn服务(转)

    码农们很定都知道svn的重要性,机器坏掉丢代码的惨痛教训想必很多人都有. jenkins可能很多人都不了解.这是一个持续集成的工具,在敏捷开发领域很流行:跟svn结合可以实现定期build.check ...

  8. 公布一个基于 Reactor 模式的 C++ 网络库

    公布一个基于 Reactor 模式的 C++ 网络库 陈硕 (giantchen_AT_gmail) Blog.csdn.net/Solstice 2010 Aug 30 本文主要介绍 muduo 网 ...

  9. Facebook 网页应用图文设置教程

    最近在弄一个项目,需要使用Facebook进行登陆并且获取用户Facebook相关的数据.网上查找有关Facebook应用设置教程,中文资料中,要么介绍的是N版之前的API,要么是App端的教程.Fa ...

  10. 纯CSS3实现的图片滑块程序 效果非常酷

    原文:纯CSS3实现的图片滑块程序 效果非常酷 之前我们经常会看到很多利用jQuery实现的焦点图插件,种类太多了,今天我想给大家分享一款利用纯CSS3实现的图片滑块应用,完全是利用CSS3的相关特性 ...