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

原创 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优化之——触发器

触发器是一个特殊的存储过程,不同的是存储过程要用CALL来调用,而触发器不需要使用CALL 也不需要手工启动,只要当一个预定义的事件发生的时候,就会被MYSQL自动调用。 创建触发器 语法如下: C...
  • l1028386804
  • l1028386804
  • 2015年07月05日 16:05
  • 1472

SQL数据库(5)——数据库完整性----触发器

触发器是一种特殊的存储过程,当用户对表中的数据进行update、insert或delete操作时自动触发执行,通常用于保障业务规则和数据完整性 触发器的常用功能 完成比约束更复杂的数据约束 检查所做的...
  • longxinghaofeng
  • longxinghaofeng
  • 2017年01月01日 13:24
  • 936

数据库触发器-初步理解

触发器?    一种特殊的存储过程,存储过程一般通过定义的名字直接调用,而触发器是通过增、删、改进行触发执行的。会在事件发生时自动强制执行。    常见触发器:after(for)或 instead...
  • fzuim
  • fzuim
  • 2016年07月12日 10:27
  • 670

【触发器】数据库_触发器实例

数据库触发器案例 一、课堂演示案例 例一:创建一个简单的insert触发器 先创建一个数据库备用 create database sampledb go   use sampledb ...
  • moshenglv
  • moshenglv
  • 2016年07月31日 15:31
  • 2335

Oracle-触发器、SQL语句优化

Oracle-触发器、SQL语句优化触发器不同的DML(CRUD)操作,触发器能够进行一定的拦截,符合条件的操作方可操作基表,反之不可操作基表。 类似于Filter、Interceptor。为什么要...
  • sdlg2015
  • sdlg2015
  • 2015年10月14日 17:20
  • 394

数据库中的触发器是用来做什么的?

触发器是一种特殊类型的存储过程,当使用下面的一种或多种数据修改操作在指定表中对数据进行修改时,触发器会生效:UPDATE、INSERT 或 DELETE。触发器可以查询其它表,而且可以包含复杂的 SQ...
  • tanliyoung
  • tanliyoung
  • 2007年06月21日 16:38
  • 1891

MySQL数据库之触发器

一 、只有一行执行语句的触发器 trigger触发器是由事件来触发某些操作,这些事件包括insert / delete / update等 例如: create trigger t_user...
  • lingzhm
  • lingzhm
  • 2015年04月22日 10:19
  • 3002

oracle数据库触发器(trigger)用法总结

http://yedward.net/?id=116   触发器的意思就是当我们对数据库对象(一般是表或视图)进行insert、update、delete操作的时候,这些操作会相应的触发一些事件的...
  • zhanzhib
  • zhanzhib
  • 2015年09月25日 10:12
  • 10604

触发器中调用远程链接的数据库的配置方法

一般我们要保证两台机器可以互通。并且两台机器上都安装并启动了msdtc.当然不是安装并启动了msdtc就可以的。我们可能还要做一些配置。1、运行 regedt32,浏览至 HKEY_LOCAL_MAC...
  • precipitant
  • precipitant
  • 2005年11月28日 12:52
  • 1524

数据库触发器(转自http://blog.csdn.net/chinayuan/article/details/6292335/#)

触发器 Oracle 触发器 : 触发器是特定事件出现的时候,自动执行的代码块。类似于存储过程,但是用户不能直接调用他们。 功能: 1 、 允许 / 限制对表的修改 2 、 自动生成派生列,...
  • Caster_Saber
  • Caster_Saber
  • 2015年05月17日 16:12
  • 973
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:数据库后台优化——触发器
举报原因:
原因补充:

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