再看数据库——(3)触发器

概念:

触发器,顾名思义,它是由事件来触发的。比如当我们对表进行操作时就会激活它执行。

说到触发器,还要提一个关键点,那就是“保持数据完整性”。什么意思呢?比如业务需求是,当我们注销一个卡号时,把该卡的充值、上机等信息也一并删除。这时如果是一个一个操作执行,就会是:注销卡——删除卡的充值信息——删除卡的上机信息(两个删除操作不分先后)。这样做的弊端是,我们很容易把其中的一个步骤遗漏了,业务也不完整。用了触发器以后,当我们注销卡时激活触发器执行删除操作。

用触发器的好处就是很大程度上有利于加强数据的完整性约束,符合业务规则

类型:

DML触发器

常用

在DML触发器下,当我们执行增删改查操作时,触发器会自动执行。DML触发器的主要作用在于强制执行业
务规则,以及扩展Sql Server约束,默认值等。

触发器可以弥补约束只约束同一表中数据的缺陷。

DDL触发器

主要作用:审核与规范。

我们主要用它来记录数据库的修改过程,以及限制程序员对数据库的修改,比如不允许删除某些指定表等。

登录触发器

显然,响应登录事件。

登录触发器将在登录的身份验证阶段完成之后且用户会话实际建立之前激发。因此,来自触发器内部且通常将到达用户的所有消息(例如错误消息和来自
PRINT 语句的消息)会传送到 SQL Server 错误日志。如果身份验证失败,将不激发登录触发器。

格式:

CREATE TRIGGER<触发器名称>

[BEFORE |  AFTER] <触发事件>ON
<表名>

FOR EACH [ROW | STATEMENT]

[WHEN<触发条件>]

<触发动作>

注意:

触发器与存储过程的唯一区别是触发器不能执行EXECUTE语句调用,而是在用户执行Transact-SQL语句时自动触发执行。

触发器本身没有过错,但由于我们的滥用会造成数据库及应用程序的维护困难。如果我们对触发器过分的依赖,势必影响数据库的结构,同时增加了维护的复杂程度。

合理的触发器编写对设计者和编写者的要求很高,必须比较全面的分析相关业务,同时全面了解触发器工作原理。也就是说写出的触发器要求在业务上考虑全面,在技术上作到最好,才能不影响业务和性能。

触发器来实现功能比较隐蔽,不容易被注意,给后期维护带来困难。

触发器与约束:

触发器的主要好处在于它们可以包含使用 Transact-SQL 代码的复杂处理逻辑。因此,触发器可以支持约束的所有功能;但它在所给出的功能上并不总是最好的方法。实体完整性总应在最低级别上通过索引进行强制,这些索引或是
PRIMARY KEY 和 UNIQUE 约束的一部分,或是在约束之外独立创建的。

 CHECK
约束只能根据逻辑表达式或同一表中的另一列来验证列值。如果应用程序要求根据另一个表中的列验证列值,则必须使用触发器。约束只能通过标准的系统错误信息传递错误信息。如果应用程序要求使用(或能从中获益)自定义信息和较为复杂的错误处理,则必须使用触发器。

如果触发器表上存在约束,则在
INSTEAD OF 触发器执行后但在 AFTER 触发器执行前检查这些约束。如果约束破坏,则回滚 INSTEAD OF 触发器操作并且不执行 AFTER 触发器。

再看数据库——(3)触发器

时间: 2024-12-25 07:54:03

再看数据库——(3)触发器的相关文章

机房收费系统合作——再看数据库设计

机房合作我负责了最简单的D层,接口层,工厂层.反正D层是我来写,于是数据库索性也就顺便设计了.已经是第三次敲机房收费系统了,每次都是相隔半年左右吧.需求搞得透透的了,数据库也就好设计了.基本跟第二次没什么大的区别,就是把Student表和Card表分开了. 重构的时候,我的数据库几乎什么都用到了:事务,存储过程,触发器,视图,联合查询等等.所以,这次设计数据库还是SO Easy的..并且,为了让婵婵和牛迁迁师哥写的方便,我把组合查询都写成了存储过程!!!!费了一番功夫,但是D层简单了不少.还记得

再看数据库——(7)游标

背景: 其实<再看数据库>系列博客本没有计划写这么多,但最近确实接触数据库比较多,又接触了这些东西,在之前很少用到,因此就整理下,和大家分享. 简介: 游标,是一个数据缓冲区,用来存放SQL语句的执行结果.与一般的执行过程不同的是,游标是从结果集中每次提取一条记录. 与关系数据库的区别: 关系数据库--面向集合,一般执行结果都是一个集合,如果要选择其中一条或几条记录,就要用where子句. 游标     --面向单条记录.游标可以对查询语句返回的结果集中的每一行进行相同或不同的操作. 因此说,

再看数据库——(2)视图

概念 *是从用户使用数据库的观点来说的. *从一个或多个表(视图)中导出来的 *一个虚表,或者说查询表 为什么要用视图呢? 一是简单,看到的就是需要的.视图不仅可以简化用户对数据的理解,也可以简化他们的操作.那些被经常使用的查询可以被定义为视图,从而使得用户不必为以后的操作每次指定全部的条件. 二是 安全,通过视图用户只能查询和修改他们所能见到的数据,但不能授权到数据库特定行和特定的列上.通过视图,用户可以被限制在数据的不同子集上:使用权限可被限制在另一视图的一个子集上,或是一些视图和基表合并后

再看数据库——(1)存储过程

当我们执行一个比较简单的操作时,一般都是用SQL语句.但是当逻辑越来越复杂时,仅仅使用顺序执行的SQL语句序列表现出很大的局限性.这时,就可以考虑用另一种方法了,那就是存储过程. 现在数据库系统往往采用客户机/服务器计算模式,很多工作可以在客户端完成,也可以在服务器端完成.客户机/服务器系统与传统的数据库系统的一个很重要的区别是,在传统的数据库系统中只存放数据,所有的应用程序都在用户端,都与用户实际运行的应用程序捆绑在一起:而客户机/服务器系统中,在数据库中还存放程序,由于这种程序以数据库对象的

再看数据库——(4)事务

什么是事务?简单的说,就是你要做的或所做的事情.用术语表述是指访问并可能更新数据库中各种数据项的一个程序执行单元. 在数据库中,一个事务可以是一条SQL语句,一组SQL语句或整个程序. 举个很经典的例子:从A账户向B账户转账.这个过程需要完成两个步骤:1)从A账户中减去钱:2)在B账户中加上相应的钱数.很简单,这两个步骤缺一不可.如果一旦出错,后果不堪设想.怎么办呢?这就引出了事务的用处. sql语句如下,当不出错时,提交事务转账成功.如果出错了,就执行回滚.数据库设计也很简单,一张money表

再看数据库——(6)连接

简单介绍: 连接是多表查询的基础. 因为关系数据库不包括指针或其它关联记录与记录的机制,连接成为了生成跨表数据关系的唯一机制. 这也就是要用连接的原因. 分类: 1.内连接 使用比較运算符比較被连接列的列值. 等值--"=" 不等--"="以外运算符 自然--"=",但它使用选择列表指出查询结果集合中所包含的列.并删除连接表中的反复列. 演示样例: 数据库中的两张表分别为dbo.Staff和dbo.Province. 注:dbo.Staff表中的

再看Cassandra 之NOSQL 数据库

Cassandra或许不会因为是NoSQL而得到关注,但是它在完成某些特定工作上,有迷人的魅力,这Netflix和Instagram两家公司一定知道. 过去的这些年,NoSQL的参与者,例如MongoDB已经得到了快速发展,受到了非常多的关注,但是 Apache Cassandra的光环褪去,作为创造了Cassandra的Facebook已经放弃了它,Cassandra的社区也好像过时了快.但 是Cassandra的命运迎来的转机,Netflix近来决心把他们自己的数据中心的oracle改成Ca

再看GS线程

再看GS线程 void GameServer::ProcessThreadTry() { int nCount = 0; packet rcvPkt; rcvPkt.data = new char[1024 * 100]; //该事件工厂主要创建了两个定时器1.livemgr的检测(即是否是有效的连接)2.道具帮会差异更新数据的获取即定时从道具帮会容器中获取差异需要保存到数据库的这个数据 //3.释放队列的处理,现在玩家下线不是直接把channel删除掉而是放到释放队列中等没有数据库访问时在删除

再看GS接包过程

再看GS接包过程 bool GameServer::ProcessLoop(packet& rPkt) { if(false == m_spDataLayer->Recv(rPkt)) return true;//没数据了 if(rPkt.is_data) { if(!rPkt.data) return false; GameChannel* pGC = m_vecChannel[rPkt.channel_id]; if(pGC) pGC->OnReceiveData(rPkt.dat