数据库后台优化——触发器

原创 2014年06月28日 11:09:32

    为了保证数据库的完整性和一致性,很多的时候需要执行多条sql语句才能达到想要的目的。

   在一对多的数据库关系中,比如卡号类别与卡号之间的关系。如果要取消某个类别的时候,就要连同齐下的所有卡号都删除。在现实中,注册的时候一般都会进行充值,当我想card表里面写东西的时候,就要向recharge表里面写一条充值记录。完成这两个操作才算完成这个功能的实现.

   对于以上的需求,每个功能的实现 都伴随着多条sql语句的执行。

为了解决上面的问题,一共有两种解决方法。一是存储过程,二是触发器。上篇博客中已经讲解了存储过程。那么这篇博客当然要来详解一下触发器了。

 

   触发器:当发生某个操作之后进行的一系列操作。

   数据库中除了查询之外 就只有增删改三种操作了。所以触发器就分为三类:insertdeleteupdate三种触发器。

 

下面来看一下实例:

   这是我创建的数据库两张表:(T_cardT_type,并且两张表设置了主键和外键约束)

 

下面是我执行删除‘临时用户’所执行的结果。(这是因为外键约束造成的错误)

 

之后我再创建delete触发器,看一下是否可以实现目的。

CREATE TRIGGER delType 
   ON  T_type
   AFTER delete
AS 
BEGIN
	declare @typeId int
	delete T_card where typeid in (select typeid from deleted) --从已经删除的表中 取出typeId
END
GO


 

执行结果与上述错误相同。

 

   在来看一下sql server创建触发器的定义模版:

   大家注意到alter了没有,insert delete update这三种触发器都是在完成操作之后再 执行之后的一系列sql语句。如果这触发器的条件执行出错,那么后面的操作就都没有办法执行了。

 

   因此,大家正在想。如果我先删除 ‘临时用户’的卡号,在来删除卡号类别,这样错误不就没有了吗。

 

   要找一系列操作来替代delete方法。

alter TRIGGER delType 
   ON  T_type
   instead of delete
AS 
BEGIN
	declare @typeId int
	select @typeId=typeid from deleted --从打算删除的表中 取出typeId :还没有删除
	delete T_card where typeid in (select typeid from deleted)   --先删除卡类别对应的卡号
	delete T_type where <a target=_blank href="mailto:typeid=@typeid		">typeid=@typeid		</a>--在删除卡号类别
END
GO


 

之后再执行sql语句看效果:

 

   达到了想要的效果。在删除临时用户这个类别和临时用户的卡号。

 

   可以使用触发器的需求:当对某张表进行增删改等操作的时候,需要对其他表进行一系列的操作。

 

   使用触发器,可以保证数据库的完整性。存储过程和触发器的编写。可以减少程序的代码,降低难度。同时也是为了减少重复代码。对于一个系统来说,如果没有使用触发器和存储过程等方法。那么代码的编写,重复量将是很可怕的。相反,如果设计好数据库,写好存储过程和触发器等。在来看这个系统,那真是简单多了。

 

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

mysql自动更新时间的触发器

在插入和更新数据之前分别获取当前系统时间来更新  CREATE TRIGGER `trg_recruitment_source_insert` BEFORE INSERT  ON `t_rec...

数据库——触发器

1:定义 是一种特殊的存储过程。一般的存储过程是通过存储过程名直接调用,而触发器主要是通过事件(增、删、改)进行触发而被执行的。其在表中数据发生变化时自动强制执行。常见的触发器有两种:aft...

Oracle数据库——触发器的创建与应用

本文转载自:http://www.cnblogs.com/shenxiaolin/p/5528088.html 一、涉及内容 1.理解触发器的概念、作用和类型。 2.练习触发器的...

两表比较后利用触发器发送邮件——ASA数据库

ASA数据库利用触发器发送HTML邮件.Example data: create table a_table ( trans_no varchar(64), part_id varcha...

Oracle数据库操作大全(十三)——pl/sql编程(存储过程、函数、触发器)

1.存储过程、函数、触发器局

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

触发器,顾名思义,它是由事件来触发的。比如当我们对表进行操作时就会激活它执行。 说到触发器,还要提一个关键点,那就是“保持数据完整性”。什么意思呢?比如业务需求是,当我们注销一个卡号时,...

菜鸟学数据库(二)——触发器

本人水平有限,写此博客只为给那些像我一样的菜鸟一点小小的帮助,还请各位大牛不要见笑。 数据库的重要性就不用我多说了吧,我们做的大多数项目都要跟数据库打交道。因此,熟练掌握数据库的各种操作,就成了一个...
  • cs408
  • cs408
  • 2015-10-06 22:01
  • 231

公交车路线查询系统后台数据库设计——关联地名和站点

数据库下载(该数据库已经输入了广州市350条公交车路线作为测试数据) 在《公交车路线查询系统后台数据库设计——查询算法》一文中,已经实现了查询站点到站点的路线查询算法,但是,现实中用户不一定使用站点进...

数据库对象——触发器——轻松走进数据库系列六

触发器看的我一知半解,看到师兄的一篇触发器的博客特别好,看完以后觉得茅塞顿开,我这个闷葫芦终于也开窍了!先跟大家分享一下这犀利的好文章,其后是我个人的一下补充和思维导图。 分享: 触发器简介: ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)