(转)菜鸟学数据库(二)——触发器
本人水平有限,写此博客只为给那些像我一样的菜鸟一点小小的帮助,还请各位大牛不要见笑。
数据库的重要性就不用我多说了吧,我们做的大多数项目都要跟数据库打交道。因此,熟练掌握数据库的各种操作,就成了一个程序员必备的技能。今天我们就来简单说一下触发器。
这篇文章只是对触发器的理论总结,要想彻底了解触发器,参考SqlServer基础之(触发器)(清晰易懂)
触发器简介:
触发器(trigger)是种特殊的存储过程,它的执行不是由程序调用,也不需要手动操作,它是由事件来触发,事件大家应该非常熟悉吧,比如按钮的Click事件、网页的Load事件等。按钮的Click事件是通过鼠标单击按钮触发的,而触发器的事件,是由对表进行增删改操作所触发的。当对一个数据库或表进行增删改( Insert,Delete,Update)的时就会激活触发器。
从SQL2005开始,根据SQL语句的不同将触发器分成了两类,一类是DML触发器,一类是DLL触发器。其中DML触发器又分为两类:After触发器和Instead Of触发器。
触发器的分类:
DML触发器:DML(Data Manipulation Language)触发器是当数据库服务器中发生数据操作语言事件时执行的存储过程。DML触发器又分为两类:After触发器和Instead Of触发器
DDL触发器:DDL触发器是在响应数据定义语言(Data Definition Language)事件时执行的存储过程。DDL触发器一般用于执行数据库中管理任务。如审核和规范数据库操作、防止数据库表结构被修改等。
DML触发器:
今天我们我们主要介绍DML触发器,DML触发器分为After触发器和Instead Of触发器。
After触发器:这类触发器是在记录已经改变完之后(after),才会被激活执行,它主要是用于记录变更后的处理或检查,一旦发现错误,也可以用Rollback Transaction语句来回滚本次的操作。
Instead Of触发器:这类触发器一般是用来取代原本的操作,在记录变更之前发生的,它并不去执行原来SQL语句里的操作(Insert、Update、Delete),而去执行触发器本身所定义的操作。
在SQL Server里,每个DML触发器都分配有两个特殊的表,一个是Inserted表,一个是Deleted表。它们两个存在于数据库服务器的内存中,是由系统管理的逻辑表,是两个临时表,而不是真正存储在数据库中的物理表。用户对这两个表只有读取的权限,没有修改的权限。
这两个表的结构(主外键、字段、数据类型等)与触发器所在数据表的结构是完全一致的,当触发器的工作完成之后,这两个表也将会从内存中删除。
Inserted和Deleted两个表的作用:
Inserted:对于插入记录操作来说,插入表里存放的是要插入的数据;对于更新记录操作来说,插入表里存放的是要更新的记录。
Deleted:对于更新记录操作来说,删除表里存放的是被更新记录;对于删除记录操作来说,删除表里存入的是被删除的旧记录。
看上面两句话可能不太明白,那么看看下面这张表是不是就明白了?
工作原理:
After触发器的工作原理:
After触发器是在SQL语句执行之后才被激活的。以删除记录为例:当SQL Server接收到一条删除操作的SQL语句时,SQL Server先将要删除的记录存放在Deleted表里,然后把数据表里的记录删除,再激活After触发器,执行After触发器里的SQL语句。执行完毕之后, 删除内存中的Deleted表,操作结束。
还是举上面的例子:在产品库存表里,如果要删除一条产品记录,在删除的时候,触发器可以检查该产品库存数量是否为零,如果不为零则取消删除操作。数据库的操作如下:
1,接收SQL语句,将要从产品库存表里删除的产品记录取出来,放在删除表里。
2,从产品库存表里删除该产品记录。
3,从删除表里读出该产品的库存数量字段,判断是不是为零,如果为零的话,完成操作,从内存里清除删除表;如果不为零的话,用Rollback Transaction语句来回滚操作(即将库存表还原成删除之前的状态)。
Instead Of 触发器的工作原理:
Instead Of触发器与After触发器不同。After触发器是在Insert、Update和Delete操作完成后才激活的,而Instead Of触发器,是在这些操作进行之前就激活了,并且不再去执行原来的SQL操作,而是用触发器本身的SQL语句代替原来的语句去执行。
还拿上面那个例子来说,删除一条产品记录的时候,用Instead Of将删除操作替换成查询该产品的库存。数据库的操作如下:
1,接收SQL语句,但不执行,而是跳转到Instead Of后面的SQL语句
2,根据传入的产品ID,将该产品的库存取出,完成操作。
说了那么多理论上的东西,下面让我们看看触发器的代码到底怎么写:
下面的一段代码是触发器的一个框架。
- CREATE TRIGGER Trigger_Name --触发器名,在一个数据库中触发器名是唯一的。
- ON Table_Name | View_Name --触发器所在的表或者视图。
- AFTER(FOR)|Instead Of INSERT,DELETE,UPDATE --定义成AFTER或Instead Of类型的触发器。
- --AFTER跟FOR相同,不可在视图上定义AFTER触发器
- -- 后面是触发器被触发的条件,最少有一个,可以邮多个。如果有多个用逗号分开,顺序无要求。
- AS --触发器要执行的操作
- BEGIN
- --BEGIN跟END组成一个代码块,可以写也可以不写,如果触发器中执行的SQL语句比较复杂,用BEGIN和END会让代码更加整齐,更容易理解。
- END
- GO --GO就代表结操作完毕
注意事项:
1,After触发器只能用于数据表不能用于视图;Instead Of触发器两者皆可,设置为With Check Option的视图也不允许建立Instead Of触发器。两种触发器都不可以建立在临时表上。
2,一个数据表可以有多个触发器,但是一个触发器只能对应一个表。
3,在同一个数据表中,对每个操作(如Insert、Update、Delete)而言可以建立许多个After触发器,而Instead Of触发器针对每个操作只有建立一个。
4,如果针对某个操作即设置了After触发器又设置了Instead Of触发器,那么Instead of触发器一定会激活,而After触发器就不一定会激活。
5,不同的SQL语句,可以触发同一个触发器,如Insert和Update语句都可以激活同一个触发器。
6,触发器名在所在的数据库里必须是唯一的。由于触发器是建立中数据表或视图中的,所以有很多人都以为只要是在不同的数据表中,触发器的名称就可以相同,其实触发器的全名(Server.Database.Owner.TriggerName)是必须 唯一的,这与触发器在哪个数据表或视图无关。
7,关键字AFTER可以用For来代取,它们的意思都是一样的,代表只有在数据表的操作都已正确完成后才会激活的触发器。
(转)菜鸟学数据库(二)——触发器相关推荐
- 菜鸟学数据库(四)——超键、候选键、主键、外键
这些年的一些经历告诉我,很多初学者搞不清超键.候选键等,被数据库中的各种键搞的一头雾水.下面就跟大家一起聊聊数据库中的那些键. 首先看看各种键的定义: 超键(super key):在关系中能唯一标识元 ...
- 菜鸟学数据库——大话 char、varchar、 nchar、nvarchar之间剪不断理还乱的关系
char.varchar.nchar.nvarchar这四个家伙不光长得很像,它们所具有的属性也十分的相似,以至于让人感觉有种"剪不断理还乱"的感觉.其实如果了解了它们各自的特点之 ...
- 菜鸟学数据库——超键、候选键、主键、外键
目录 首先看看各种键的定义: 结合实例的具体解释: 超键: 候选键: 主键: 外键: 欢迎大家关注我的新书<Spring Boot趣味实战课> 京东 当当 天猫 这些年的一些经历告诉我,很 ...
- 菜鸟学Linux 第095篇笔记 MySQL 5.6主从复制
菜鸟学Linux 第095篇笔记 MySQL 5.6主从复制 内容总览 主从服务器复制过滤 MySQL 5.6 简单主从模式配置步骤 mysql-proxy 主从服务器复制过滤 主服务器配置 基于数据 ...
- 菜鸟学Linux 第107篇笔记 zabbix概念和安装
菜鸟学Linux 第107篇笔记 zabbix概念和安装 内容总览 SNMP catti nagios zabbix Various Monitoring Functions Zabbix Agent ...
- 菜鸟学算法一基础知识篇
菜鸟学算法<一>知识准备篇 刚刚上任,急着给兄弟们一点见面礼,嘿嘿 前言:论坛上有关算法分析的文章不少,也不少精品 但对于刚学CARACK来说,只是叹为观止 原因如下: 1.论坛高手如云, ...
- 菜鸟学exchange之一:exchange邮件系统的简单安装和部署
菜鸟学exchange之一:exchange邮件系统的简单安装和部署 2009-05-10 23:15:34 实验背景: 西安凌云高科技是一家拥有300名员工的高新技术企业,总部在位于西安.在上海和北 ...
- python语言入门教程-菜鸟学Python入门教程大盘点|7个多月的心血总结
原标题:菜鸟学Python入门教程大盘点|7个多月的心血总结 阅读本文大概需要5分钟 菜鸟学python已经写了70几篇,入门的教程已经快写完了,我把入门的文章整理了一下,下面是入门篇的一些总结,也是 ...
- 不扯淡学数据库实践联系理论-课程
内容简介: 通过我多年在不同项目需求下使用不同数据库的实践给大家讲解一下数据库的实际使用情况.本课程从零开始讲解数据库,使用开源免费的mysql从安装到使用和开发进行实际操作和演示,甚至有些内容多年开 ...
最新文章
- 【机器视觉】 global算子
- html导出excel 内存不足,web导出excel那些坑
- RabbitMQ和Kafka的显著差异(over)
- python颜色识别算法_纯Python编写K-means算法,提取图片中的主体颜色
- 直接拿来用!GitHub 上那些值得你 Star 的开源项目!
- Android仿人人客户端(v5.7.1)——对从服务器端(网络)获取的图片进行本地双缓存处理(流程图或活动图)...
- java同步队列_Java 中队列同步器 AQS(AbstractQueuedSynchronizer)实现原理
- 计算机中音乐设备数字接口,多媒体cai课件制作技术复习题
- 使用ffmpeg获取影片信息
- freemarker必须指定模板文件夹吗?
- 如何让应用出现在LINUX的右键/打开方式/更多应用
- 【考研数学】视频,你喜欢看哪位老师?
- SQL经典50题练习
- Superset 实现可视化报表发布
- 科研论文研读工具及英文论文写作
- 火山视频抖音版批量下载,一个脚本就够了,手把手教你批量下载抖音火山高清视频。
- 3D元素周期表源码(已加注释)及分析
- 回忆2012-入坑OpenStreetMap10年纪
- 虚拟资源项目是什么?依靠虚拟资源项目月入万元能实现吗?
- 浅析Betaflight中的OSD叠加程序【MAX7456AT7456】
热门文章
- 1.窗体与界面设计-菜单应用实例
- CUDA计算向量内积的程序(源自CUDA范例编程)
- 在线邮箱地址提取工具
- ECMAScript中基本类型和引用类型的值在复制变量值时的区别
- JdbcTemplate简单介绍
- Android布局--AbsoluteLayout
- 如何保养与维护笔记本硬盘
- Ubuntu14.04搭建Oracle instantClient 11.2.0.4并配置cx_Oracle5.1.2
- CakePHP:链接地址问题(不用mod_rewrite,IIS)
- 寻找最大的K个数(下)