触发器是一种特殊的存储过程,类似于其它编程语言中的事件函数,SQL Server™ 允许为 INSERT、UPDATE、DELETE 创建触发器,当在表(视图)中插入、更新、删除记录时,触发一个或一系列 T-SQL 语句。

触发器分为两种一个是INSTEAD OF 触发器;一个是AFTER 触发器。

AFTER 触发器(也叫“FOR”触发器)会在触发 insert、update 或是delect 动作之后执行。例如,一个 Employees 表上的 AFTER 触发器会在在 Employee 表上执行一条 update 语句后激活。因此,AFTER 触发器只有在已插入一行或是多行和所有约束已被处理且通过后才触发。INSTEAD OF 触发器和 AFTER 触发器有本质上的不同,因为 INSTEAD OF 触发器代替触发动作进行激发。就拿同样的例子来说,如果在 Emplyees 表上有一个 INSTEAD OF UPDATE 触发器和在这个表上执行一条 UPDATE 语句,结果是这条 UPDATE 语句并不会改变 Employee 表中的任何一行。相反,这条 UPDATE 语句只有是为了踢离 INSTEAD OF UPDATE 触发器,这个触发器可能会,也可能不会改变 Employees 表中的数据。  因此,怎么决定在合适的时间和位置放置 INSTEAD OF 触发器呢?有几个关键的因素在做决定是值得考虑的。AFTER 触发器多用在动作必须在表中数据发生改变之后才执行后情情况。比如,AFTER 触发器可以用于将对数据作任何变动的日志记录在一个相对独立的审计表中。INTEAD OF 触发器也能做同样的工作。但是 INSTEAD OF 触发器在这个情况下的效率比较低,因为更新动作只能在将它发生的动作准确地记录在审计表之后才允许执行。

注意:不能在触发器中使用的语句

触发器中可以使用大多数 T-SQL 语句,但如下一些语句是不能在触发器中使用的。

  • CREATE 语句,如:CREATE DATABASE、CREATE TABLE、CREATE INDEX 等。
  • ALTER 语句,如:ALTER DATABASE、ALTER TABLE、ALTER INDEX 等。
  • DROP 语句,如:DROP DATABASE、DROP TABLE、DROP INDEX 等。
  • DISK 语句,如:DISK INIT、DISK RESIZE。
  • LOAD 语句,如:LOAD DATABASE、LOAD LOG。
  • RESTORE 语句,如:RESTORE DATABASE、RESTORE LOG。
  • RECONFIGURE
  • 说明:有人说不能用 TRUNCATE TABLE 语句,其实是可以的。

触发器例子:

比如,这么两个表:
  Create Table Student(         --创建学生表
    StudentID int primary key,     --学号,定义主键约束
    ....
    )

Create Table BorrowRecord(         --创建借书记录表
    BorrowRecord int identity(1,1),     --自动增长流水号 
    StudentID   int ,             --学号
    BorrowDate   datetime,           --借出时间
    ReturnDAte   Datetime,           --归还时间
    ...
  )

用到的功能有:
    1.如果我更改了学生的学号,我希望他的借书记录仍然与这个学生相关(也就是同时更改借书记录表的学号);
    2.如果该学生已经毕业,我希望删除他的学号的同时,也删除它的借书记录。
  等等。

这时候可以用到触发器。对于1,创建一个Update触发器:
 -------------------------------------------------------
  --Name:truStudent
  --func:更新BorrowRecord 的StudentID,与Student同步。
  --Use :None
  --User:System
  --Author: wp_love
  --Date : 2007-11-16
  --Memo : 临时写写的,给大家作个Sample。没有调试阿。
  -------------------------------------------------------
  Create Trigger truStudent
    On Student
    for Update   --触发器类型--Update
 
  As
    if Update(StudentID)
    begin

Update BorrowRecord 
      Set br.StudentID=i.StudentID
      From BorrowRecord br , Deleted d ,Inserted i 
      Where br.StudentID=d.StudentID

end     
          
  理解触发器里面的两个临时的表:Deleted , Inserted 。注意Deleted 与Inserted分别表示触发事件的表“旧的一条记录”和“新的一条记录”。
  一个Update 的过程可以看作为:生成新的记录到Inserted表,复制旧的记录到Deleted表,然后删除Student记录并写入新纪录。

对于2,创建一个Delete触发器

-------------------------------------------------------
  --Name:trdStudent
  --func:同时删除 BorrowRecord 的数据
  --Use :None
  --User:System
  --Author: 
  --Date : 2007-11-16
  --Memo : 临时写写的,给大家作个Sample。没有调试阿。
  -------------------------------------------------------
  Create trigger trdStudent
      On Student
      for Delete
  
  As
    Delete BorrowRecord 
    From BorrowRecord br , Delted d
    Where br.StudentID=d.StudentID

从这两个例子我们可以看到了触发器的关键:A.2个临时的表;B.触发机制。
  这里我们只讲解最简单的触发器。

什么是触发器及简单例子相关推荐

  1. [转]Terraform 使用 - 从最简单例子开始

    Terraform 使用 - 从最简单例子开始 https://yanbin.blog/terraform-get-started-with-first-sample/ Terraform 是一个 I ...

  2. webpack入门之简单例子跑起来

    webpack入门之简单例子跑起来 webpack介绍 Webpack是当下最热门的前端资源模块化管理和打包工具,它可以将很多松散的模块按照依赖和规则打包成符合生产环境部署的前端资源,还可以将按需加载 ...

  3. 图片上传(加水印、缩略图、远程保存)的简单例子

    图片上传(加水印.缩略图.远程保存)的简单例子(应用于51aspx.com) 该源码下载地址:http://51aspx.com/CV/ImageUpload 今天看到xiongeee发的文章使用使用 ...

  4. java hashtable import,Hashtable的一个简单例子

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 以下是关于Hashtable的简单例子,谁知道别的遍历Hashtable的方法,请回复! package no1; import java.util.En ...

  5. SAP MM采购定价过程的一个简单例子

    SAP MM采购定价过程的一个简单例子 本文以一个简单的例子阐述了SAP MM模块中采购定价的基本原理.本例中,假定采购订单里输入的是含税采购价,然后系统自动计算出物料最终的采购价格(含税价-税额=采 ...

  6. .net中使用反射的简单例子

    说明:由于工作原因,本人使用反射的机会不是很多,所以没有必要为了炫耀技术而使用这种技术,不过今天有人问到这方面的问题,所以做了一个简单例子,供初学者参考,代码如下: using System; usi ...

  7. linux下Makefile中包含有shared library动态链接库文件时候的简单例子

    如果不知道什么是makefile,可以首先看我的另一篇博客: linux下Makefile的简单例子及解释 http://www.cnblogs.com/lihaozy/archive/2012/08 ...

  8. java 国际化例子_JavaSE 国际化 简单例子

    ①在src下添加两个文件: base_zh_CN.properties Test=\u8fd9\u662f\u4e2d\u6587 base_en_US.properties Test=english ...

  9. 6翻了C语言,《嗨翻C语言》随书练习六 6章 二叉树简单例子

    二叉树简单例子/* <嗨翻C语言>随书练习 6章    2016-12-06 xiousheng@126.com  二叉树例子,警务罪犯判断档案系统,哈哈 书中可以专家系统例子 */ #i ...

最新文章

  1. 视频百教程度云_腾讯视频的进击
  2. BitNami Redmine Stack
  3. android Q版本外部存储问题以及获取空间大小问题
  4. mooc作业怎么上传附件_怎么以最低价格入门hifi音响?
  5. 惠安七号机器人创意园_我是F518创意园,请为我投票!
  6. 添加notepad到右键菜单栏
  7. LeetCode —— 面试题 08.12. 八皇后(Python)
  8. Python数组类型——列表(list)
  9. matlab 实现 kmeans聚类,gscatter的应用
  10. java判断最高分最低分_java排序练习:输入三个学生的姓名和他们的三个评分,去掉最高分和最低分...
  11. Docker学习总结(47)——温故Docker常用命令行
  12. lwip协议栈源码分析之pbuf
  13. 江西政务服务“掌上办”新模式分享
  14. gotoxy函数定义
  15. Win7系统安装samba服务器,Win7 VirtualBox samba 服务器搭建
  16. 新建android模拟器无法拨号 真机可以拨号,Android模拟器相关操作设置
  17. FillRect与FrameRect
  18. 迁移进行时,告别GitHub的时候到了?
  19. 2019XUPT_ACM 寒假训练第二期
  20. ACM儿童节热身训练

热门文章

  1. 她与父亲的小故事(我支持你)
  2. 洛谷P1023 税收与补贴问题
  3. 计算机科学博士上海纽约大学,徐立华 - 上海纽约大学 - 计算机科学
  4. live555的一点bug修改(客户端和服务器)
  5. 深入浅出MFC学习笔记(第6章 :MFC程序的生死因果)
  6. 彻底理解Java并发:Java内存模型
  7. MySQL 数据库面试题总结(50 道题含答案解析)
  8. 如何建设好智能工厂?
  9. 学习 Python 之 Pygame 开发坦克大战(四)
  10. 五大常用算法——分治法,动态规划,回溯法,分支界限法,贪心算法