导读:机房做到注册和充值了,有两个关键点:在注册的时候,同时给该用户写入充值记录;在充值的时候,给该用户更改余额信息。第一次做的时候,是一条一条的写,那时候师傅就说了触发器和存储过程的使用,现在终于用上了。针对本次使用触发器的情况,做一个说明。

一、What(是什么)?



触发器(Trigger):是一个能有系统自动执行对数据库修改的语句。由三部分组成:一、事件:事件是指对数据库的插入,删除,修改等操作。触发器在这些事件发生时开始工作。二、条件:触发器将测试条件是否成立。成立则执行相应的动作,否则不执行。三、动作。如果触发器测试满足预定的条件,那么,就由DBMS执行这些动作。同时,触发器也是一种特殊类型的存储过程,不由用户直接调用。

触发器的类别:

1,( 数据操纵语言 Data Manipulation Language)触发器:是指触发器在数据库中发生DML事件时将启用。DML事件即指在表或视图中修改数据的insert、update、delete语句。

2,DDL(数据定义语言 Data Definition Language)触发器:是指当服务器或数据库中发生(DDL事件时将启用。DDL事件即指在表或索引中的create、alter、drop语句也。

3,登陆触发器:是指当用户登录SQL SERVER实例建立会话时触发。

我的理解:满足某一个或多个条件时,使另一事件执行。就像杯子的水装满了,就会触发溢出事件一样。在这里就是,当学生成功注册后,同时写入充值记录;当充值成功后,同时更改余额。

PS:条件是成功注册、充值。(这里可以结合事务学习)

二、Why(优点)



1,触发器可通过数据库中的相关表实现级联更改;不过,通过级联引用完整性约束可以更有效地执行这些更改。

2,触发器可以强制比用 CHECK 约束定义的约束更为复杂的约束。

3,与 CHECK 约束不同,触发器可以引用其它表中的列。例如,触发器可以使用另一个表中的 SELECT 比较插入或更新的数据,以及执行其它操作。

三、How(怎么用)



1,注册时,同时写记录到充值表:

<span style="font-size:18px;"><span style="font-family:KaiTi_GB2312;font-size:24px;">-- =============================================
-- Author: <何下下>
-- Create date: <2015/1/6>
-- Description: <在注册表插入数据时,在充值表中插入一条数据>
-- =============================================
ALTER TRIGGER [dbo].[UpdateRecharge]--写入触发器的名称
ON [dbo].[TC_StudentInfo] --创建触发器的表
AFTER INSERT--在插入事件之后触发
AS
--定义变量
declare @CardID char(10),
@UserName char(10),
@SDate char(10),
@STime char(10),
@Cash numeric(18,1),
@ChkState char(10)
--通过查询给变量赋值
select @UserName =UserName FROM inserted
select @CardID =CardID from inserted
select @SDate = SDate from inserted
select @STime=STime from inserted
select @Cash =Cash from inserted
select @ChkState=ChkState from inserted BEGIN SET NOCOUNT ON;
--向充值记录表中插入数据
insert into TC_RechargeInfo (CardID ,States ,RDate ,RTime ,AddCash ,UserID ) values (@CardID ,@ChkState ,@SDate ,@STime ,@Cash ,@UserName )
END
</span></span>

说明:

1,ALTER TRIGGER :因为我开始建了一个失败的触发器,在原来的基础上进行修改,所以ALTER TRIGGER ,而不是Create。

2,AFTER INSERT :这里是在注册表中插入一条记录之后运行触发器(条件,学生注册成功),在这个位置,还有after delete,after update。

after:触发器在触发它们的语句完成后执行。如果该语句因错误而失败,触发器将不会执行。

PS:不能为视图指定after触发器,只能为表指定该触发器。可以为表指定一个或多个触发器,除了可以用sp_settriggerorder控制第一个和最后一个,其他的,无法控制其顺序。

2,充值时,更改学生余额信息

<span style="font-size:18px;"><span style="font-family:KaiTi_GB2312;font-size:24px;">-- =============================================
-- Author: <何下下>
-- Create date: <2015/1/6>
-- Description: <充值成功后,更改学生表里的余额>
-- =============================================
ALTER TRIGGER [dbo].[UpdateBalance]--触发器名称
ON [dbo].[TC_RechargeInfo]--创建位置
after insert--在插入数据之后
AS --定义变量
declare @IntRows int,
@CardID char(10),
@AddCash numeric(18,1) --通过查询为变量赋值
select @AddCash=AddCash from inserted
select @CardID=CardID from inserted
select @IntRows=count(CardID) from inserted
--如果该卡号的充值记录大于1
if @IntRows >1 BEGIN SET NOCOUNT ON;
--更改余额
update TC_StudentInfo set Cash =Cash +@AddCash where CardID=@CardID END
</span></span>

说明:

1,if @IntRows >1:刚开始的时候,是没有这一个判断的,所以就导致了我每注册一个新用户,他的余额都是充值金额的2倍。因为写入注册表的时候,触发向充值表中写数据。而像充值表中写数据,又触发了更改余额。后来,我就想到了加上这一个判断:如果充值表中该卡号的记录为1,说明是刚注册的新用户,这时候,用户的余额就是他注册时的充值金额,不需要触发更改余额的事件。

2,from inserted,inserted是SQLServer为每个触发器创建的临时数据表之一,另一个是Deleted表。这两个表由系统来维护,它们存在于内存中而不是数据库中。这两个表的结构总是与被该触发器作用的表的结构相同,触发器执行完成后,与该触发器相关的这两个表也被删除。 (这个挺好的,给我的感觉就是,你只管拿去用,别的都别管了,系统创建,系统维护,系统删除)

PS:inserted表和deleted表的区别

Deleted 表:用于存储 DELETE 和 UPDATE 语句所影响的行的复本。在执行 DELETE 或 UPDATE 语句时,行从触发器表中删除,并传输到 deleted 表中。(我认为deleted表有类似于回收站的作用)Deleted 表和触发器表通常没有相同的行。

Inserted 表:用于存储 INSERT 和 UPDATE 语句所影响的行的副本。在一个插入或更新事务处理中,新建行被同时添加到 inserted 表和触发器表中。Inserted 表中的行是触发器表中新行的副本。

Inserted表和Deleted表的区别

Inserted表 Deleted表
插入Insert 有数据 无数据
删除Delete 无数据 有数据
更新Update 有数据(新) 有数据(旧)

四、总结

过多触发器会造成数据库及应用程序的维护困难,同时对触发器过分的依赖,势必影响数据库的结构,同时增加了维护的复杂程序。总体说来,触发器的耦合性太强,所以,虽然触发器可以给我们带来很多便利,但仍须慎用!

请大家多多指教!

.NET重构(三):在注册和充值中,触发器的使用的更多相关文章

  1. Spring-cloud微服务实战【三】:eureka注册中心(中)

      回忆一下,在上一篇文章中,我们创建了两个springboot项目,并且在consumer项目中通过restTemplate进行HTTP通信,成功访问到了producer提供的接口,思考一下这样的实 ...

  2. 通过三张图了解Redux中的重要概念

    上周利用业余的时间看了看Redux,刚开始有点不适应,一下在有了Action.Reducer.Store和Middleware这么多新的概念. 经过一些了解之后,发现Redux的单向数据里的模式还是比 ...

  3. Ioc容器Autofac系列(3)-- 三种注册组件的方式

    简单来说,所谓注册组件,就是注册类并映射为接口,然后根据接口获取对应类,Autofac将被注册的类称为组件. 虽然可像上篇提到的一次性注册程序集中所有类,但AutoFac使用最多的还是单个注册.这种注 ...

  4. 根据自己的需要,把别人开发好的东西搬过来,优化and重构,在优化的过程中,甚至也会弄出一套全新的东西(转)

    赵海平在今年三月份来到阿里,听毕玄(他现任主管)说去年五六月份就跟赵海平聊上了.有人问:为啥 BAT 三大巨头,你看中了阿里巴巴?在今天现场达一千多人的分享中赵海平给出了回复:“因为百度和腾讯没找我呗 ...

  5. rails将类常量重构到数据库对应的表中之一

    问题是这样:原来代码.html.erb页面中有一个select元素,其每个item对应的是model中的类常量: <%= f.select :pay_type,Order::PAYMENT_TY ...

  6. MVC-AOP思想-Filter 三种注册方式

    在ASP.NET MVC框架中,为我们提供了四种类型的Filter类型包括:IAuthorizationFilter.IActionFilter.IResultFilter.IExceptionFil ...

  7. MVC-AOP(面向切面编程)思想-Filter 三种注册方式

    在ASP.NET MVC框架中,为我们提供了四种类型的Filter类型包括:IAuthorizationFilter.IActionFilter.IResultFilter.IExceptionFil ...

  8. Dubbo源代码实现三:注册中心Registry

    我们知道,对于服务治理框架来说,服务通信(RPC)和服务管理两部分必不可少,而服务管理又分为服务注册.服务发现和服务人工介入,我们来看看Dubbo框架的结构图(来源网络): 图中可以看出,服务提供者P ...

  9. 【mvrp多协议vlan注册协议给予三种注册方式的验证】

    MVRP 多vlan注册协议给予三种注册模式的配置 一:根据项目需求搭建好拓扑图如下 二:配置: 首先对项目做理论分析,sw1,sw2,sw3所组成的直连网络中,为使不同的PC之间进行通信,按vlan ...

随机推荐

  1. 让linux下的eclipse支持GBK编码

    原文链接:http://leaze.blog.51cto.com/83088/195584 今天,把windows下的工程导入到了Linux下eclipse中,由于以前的工程代码,都是GBK编码的,而 ...

  2. codeforces736D. Permutations(线性代数)

    题意 $m \leqslant 500000$,题目打错了 Sol 神仙题Orz 构造矩阵$B$,使得$B[b[i]][a[i]] = 1$ 那么他的行列式的奇偶性也就对应了生成排列数列数量的奇偶性( ...

  3. C语言abort函数

    C语言编程入门教程,C语言库函数的abort函数的作用是异常终止一个进程,意味着abort后面的代码将不再执行. #include<stdio.h> #include<stdlib. ...

  4. Ubuntu16.04 + cuda8.0 + GTX1080安装教程

    1. 安装Ubuntu16.04 不考虑双系统,直接安装 Ubuntu16.04,从 ubuntu官方 下载64位版本: ubuntu-16.04-desktop-amd64.iso . 在MAC下制 ...

  5. Linux下各文件夹的结构说明及用途介绍(转载)

    linux下各文件夹的结构说明及用途介绍: /bin:二进制可执行命令. /dev:设备特殊文件. /etc:系统管理和配置文件. /etc/rc.d:启动的配 置文件和脚本. /home:用户主目录 ...

  6. Android学习总结(十四) ———— ListView Item多布局的实现

    一.基本概念 实现一个Item的多布局.像我们经常在用的各种即时通讯工具,QQ.微信等,假设他们的会话界面是ListView实现的,那么ListView就有多种Item布局,要实现ListView里面 ...

  7. Jordan 标准型的推论

    将学习到什么 从 Jordan 标准型出发,能够获得非常有用的信息.   Jordan 矩阵的构造 Jordan 矩阵 \begin{align} J=\begin{bmatrix} J_{n_1}( ...

  8. 快学UiAutomator各种框架介绍

    Monkey 编写语言:命令行 运行环境:使用adb连接PC运行测试对象:Android平台自动化测试的一种手段,通过Monkey程序模拟用户触摸屏幕.滑动Trackball.按键等操作来对设备上的程 ...

  9. shell脚本,如何监控mysql数据库。

    [root@localhost wyb]# cat jkmysql #!/bin/bash status=`/etc/init.d/mysqld status|grep running|wc -l` ...

  10. CSS实现跳动的桃心

    又来刷题--CSS动画实现跳动的桃心,从哪里跌倒就从哪里爬起来,哈哈哈~ 分析:首先,得画出一个桃心,然后再用动画效果让它跳起来(关于动画,实在是弱项啊~~~,得补补了). 第一步:画桃心,思路是一个 ...