浅入浅出触发器

1、触发器的使用背景

做完机房收费系统个人重构之后只用了存储过程,最近在看牛腩视频讲到触发器的使用,当时就遇到过外键约束不能删除、有关联的表记录的问题,当时的解决方法有的使用了存储过程,或者是标记相关联的约束键不可用。其实触发器和存储过程的使用的相似的,可以说触发器就是一种特殊类型的存储过程。

举个机房收费系统中的例子:

截取一部分数据库关系图:

当想要删除一个用户时,该用户充值和退卡的记录就会受到影响。这时就会出现外键约束的错误。

这是因为充值和退卡表都和用户表的用户ID属性有关系,当删除用户表中一个用户时,应该连同删除充值表和退卡表中该用户ID的记录。这样才不会楚翔这种错误。当我们需要删除一个表的级联的所有表时,触发器就闪亮登场了。

2、触发器的应用

拿新闻发布系统来说,数据库设计图如下所示:

当药删除新闻类别时,该新闻类别下有相关的新闻,每条新闻下又有很多条新闻评论。我们需要在删除一条新闻类别时同时删除掉该news表中该id的新闻,同时删除comment表idnewsId是该新闻的评论。

使用触发器如下:

在新闻类别表现创建存储过程:因为是删除新闻类别,即删除就是触发点。

-- =============================================
-- Author:		许丹
-- Create date: 2014-7-18
-- Description:	删除类别触发器
-- =============================================
ALTER TRIGGER [dbo].[trigCategoryDelete]  -- 触发器名称
   ON  [dbo].[category] --操作的数据库表
   instead of DELETE  --用下面的语句代替删除语句
AS
BEGIN
 --   --删除该类别下的所有新闻
	--delete news where caId in (select id from deleted)
	declare @caId int
	select @caId=id from deleted
	--删除评论
	delete comment where newsId = (select newsId from news where caId [email protected])
	--删除新闻
	delete news where caId [email protected]   --先删除该类别下的所有新闻
	--删除类别
	delete category where [email protected]  --再删除该类别
END

对三条删除语句的解释:

首先声明一个@id变量,当删除一条新闻类别时

delete from category where id=6

这是一个触点,这时并不直接删除类别,而是触发这个触发器。用触发器下面的删除语句代替这个删除操作。首先选择被删除的新闻类别的ID,然后删除该新闻ID下的所有评论,在删除该类别下的所有新闻,最后删除该类别。这样就解决了级联删除的效果。

其实触发器和存储过程的创建一样,有它特定的语句,下面简单的谈谈我对触发器的理解:

3、触发器的概念:

触发器是一类特殊的存储过程,在对表或者视图进行增删改操作时,它就会被激发开始运行,有时,触发器也可以解释为自动执行的存储过程。一触即发。

4、触发器的优点:

  • 触发器自动执行。
  • 触发器能够对数据库中的相关表实现级联更改。触发器基于一个表,但可以实现多表操作,实现相关表的级联操作。
  • 触发器可以实现比CHECK约束更为复杂的数据完整性约束。
  • 触发器可以评估数据修改前后的表的状态,并根据其差异采取对策。
  • 一个表中可以同时存在三个不同操作的触发器(insert、update、delete),对于同一个修改语句可以有多个不同的相应对策。

5、慎用触发器器

触发器功能强大,轻松可靠地实现许多复杂的功能,为什么又要慎用呢。触发器本身没有过错,但由于我们的滥用会造成数据库及应用程序的维护困难。在数据库操作中,我们可以通过关系、触发器、存储过程、应用程序等来实现数据操作…… 同时规则、约束、缺省值也是保证数据完整性的重要保障。如果我们对触发器过分的依赖,势必影响数据库的结构,同时增加了维护的复杂程度。

总结:

看牛腩视频有种相见恨晚的感觉,人类真的是很强大,让我们的编程语言越来越简单,实现的功能越来越强大,昨天听一个是个讲关于机房合作的经验,中间提到EA的强大,数据库的设计是越来越简单,EA可以生成代码,可以导出数据库,当时的感觉就是自己的知识真的匮乏,很多没有动手尝试,用一些很笨的方法。触发也是这样,级联的表如果是一个两个还好说,要是一百个(当然这就数据库冗余了,应该没有这样的数据库),就太麻烦了。编程仍未结束,要实现更好更高效率的,更简单的解决方法是我们的努力方向。

浅入浅出触发器

时间: 2024-10-22 03:09:09

浅入浅出触发器的相关文章

浅入浅出SQL注入

已经开始了学习牛腩新闻发布系统,在讲后台代码的时候讲了一些重构SQLHelper的知识,存储过程和触发器等,这些以前都是接触过的.而SQL注入是以前没有注意过的,所以停下来总结学习一下SQL注入. 首先什么是SQL注入呢? 实战篇~~~~~~~~~~ SQL注入概念 所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令,比如先前的很多影视网站泄露VIP会员密码大多就是通过WEB表单递交查询字符暴出的,这类表单特别容易受到

『浅入浅出』MySQL 和 InnoDB

作为一名开发人员,在日常的工作中会难以避免地接触到数据库,无论是基于文件的 sqlite 还是工程上使用非常广泛的 MySQL.PostgreSQL,但是一直以来也没有对数据库有一个非常清晰并且成体系的认知,所以最近两个月的时间看了几本数据库相关的书籍并且阅读了 MySQL 的官方文档,希望对各位了解数据库的.不了解数据库的有所帮助. 本文中对于数据库的介绍以及研究都是在 MySQL 上进行的,如果涉及到了其他数据库的内容或者实现会在文中单独指出. 数据库的定义 很多开发者在最开始时其实都对数据

重新学习MySQL数据库2:『浅入浅出』MySQL 和 InnoDB

重新学习Mysql数据库2:『浅入浅出』MySQL 和 InnoDB 作为一名开发人员,在日常的工作中会难以避免地接触到数据库,无论是基于文件的 sqlite 还是工程上使用非常广泛的 MySQL.PostgreSQL,但是一直以来也没有对数据库有一个非常清晰并且成体系的认知,所以最近两个月的时间看了几本数据库相关的书籍并且阅读了 MySQL 的官方文档,希望对各位了解数据库的.不了解数据库的有所帮助. 本文中对于数据库的介绍以及研究都是在 MySQL 上进行的,如果涉及到了其他数据库的内容或者

包学会之浅入浅出Vue.js:升学篇

上一篇<包学会之浅入浅出Vue.js:开学篇>中,我们初步了解单页面组件这个概念,现在通过一个项目,来进一步解析组件的应用吧,Go~ 需求背景 组件库是做UI和前端日常需求中经常用到的,把一个按钮,导航,列表之类的元素封装起来,方便日常使用,调用方法只需直接写上<qui-button></qui-button>或者<qui-nav></qui-nav>这样的代码就可以,是不是很方便呢,接下来我们将要完成以下页面: 这是我们组件库的首页,包含三个子

浅入深出ElasticSearch构建高性能搜索架构

浅入深出ElasticSearch构建高性能搜索架构  课程学习地址:http://www.xuetuwuyou.com/course/161 课程出自学途无忧网:http://www.xuetuwuyou.com 一.课程用到的软件 ElasticSearch5.0.0 Spring Tool Suite 3.8.2.RELEASE Maven3.0.5 Spring4 Netty4 Hadoop2.7.1 Kibana5.0 JDK1.8.0_111 二.课程目标 1.快速学习Elastic

包学会之浅入浅出Vue.js:结业篇

在第一篇<包学会之浅入浅出Vue.js:开学篇>和上一篇<包学会之浅入浅出Vue.js:升学篇>的学习中,我们首先了解了Vue环境的搭建以及两个重要思想--路由和组件的学习,通过组件库中的按钮组件和导航组件,相信大家也开始了解相应的知识点,接下来我们会详细分析下如何完成由多个组件组成一个复用组件的开发流程. 下面先看看我们的需求 列表组件quiList.vue 本节我们主要要完成这样一个列表功能,每一行的列表是一个组件,列表内可能出现按钮组件或者箭头组件,点击按钮组件可以自定义事件

浅入浅出---JQuery到底是什么?

学习完了JQuery之后,我便感觉云里雾里的,JQuery到底是什么,朦朦胧胧感觉到JQuery应该是javascript函数的封装,就应该像WinForm窗体应用程序中可以调用的系统函数,据之前所学的javascript,知道JavaScript是一种镶嵌在HTML文档中的一种脚本语言, <body> <formid="form1" name="form1" method="post" > <label for=&

浅入浅出EmguCv(一)OpenCv与EmguCv

最近接触计算机视觉方面的东西,于是准备下手学习opencv,从官网下载windows的安装版,配置环境,一系列步骤走完后,准备按照惯例弄个HelloWord.也就是按照网上的教程,打开了那个图像处理领域非常有名的lena图片(据说是个裸女\(^o^)/~). 正当我摩拳擦掌准备开始opencv学习之旅的时候,习惯了GUI的我突然觉得用C++做开发弄界面很麻烦,不如用C#来的方便,于是又发现了一个封装了opencv的.net库,可以被VC++,VC#,VB.net调用,即EmguCV.网上对于Em

浅入浅出EmguCv(三)EmguCv打开指定视频

打开视频的思路跟打开图片的思路是一样的,只不过视频是由一帧帧图片组成,因此,打开视频的处理程序有一个连续的获取图片并逐帧显示的处理过程.GUI同<浅入浅出EmguCv(二)EmguCv打开指定图片>一样,只不过处理程序编程如下所示: 1 /// <summary> 2 /// 点击按钮打开指定图片 3 /// </summary> 4 /// <param name="sender"></param> 5 /// <pa