l  After触发器:这类触发器是在记录已经改变完之后(after),才会被激活执行,它主要是用于记录变更后的处理或检查,一旦发现错误,也可以用Rollback Transaction语句来回滚本次的操作。

l  Instead Of触发器:这类触发器一般是用来取代原本的操作,在记录变更之前发生的,它并不去执行原来SQL语句里的操作(Insert、Update、Delete),而去执行触发器本身所定义的操作。

After触发器的工作原理

After触发器是在记录更变完之后才被激活执行的。以删除记录为例:当SQL Server接收到一个要执行删除操作的SQL语句时,SQL Server先将要删除的记录存放在删除表里,然后把数据表里的记录删除,再激活After触发器,执行After触发器里的SQL语句。执行完毕之后,删除内存中的删除表,退出整个操作。

还是举上面的例子:在产品库存表里,如果要删除一条产品记录,在删除记录时,触发器可以检查该产品库存数量是否为零,如果不为零则取消删除操作。看一下数据库是怎么操作的:

(1)接收SQL语句,将要从产品库存表里删除的产品记录取出来,放在删除表里。

(2)从产品库存表里删除该产品记录。

(3)从删除表里读出该产品的库存数量字段,判断是不是为零,如果为零的话,完成操作,从内存里清除删除表;如果不为零的话,用Rollback Transaction语句来回滚操作。

Instead Of触发器的工作原理

Instead Of触发器与After触发器不同。After触发器是在Insert、Update和Delete操作完成后才激活的,而Instead Of触发器,是在这些操作进行之前就激活了,并且不再去执行原来的SQL操作,而去运行触发器本身的SQL语句。

注意事项:

l  After触发器只能用于数据表中,Instead Of触发器可以用于数据表和视图上,但两种触发器都不可以建立在临时表上。

l  一个数据表可以有多个触发器,但是一个触发器只能对应一个表。

l  在同一个数据表中,对每个操作(如Insert、Update、Delete)而言可以建立许多个After触发器,但Instead Of触发器针对每个操作只有建立一个。

l  如果针对某个操作即设置了After触发器又设置了Instead Of触发器,那么Instead of触发器一定会激活,而After触发器就不一定会激活了。

l  Truncate Table语句虽然类似于Delete语句可以删除记录,但是它不能激活Delete类型的触发器。因为Truncate Table语句是不记入日志的。

l  WRITETEXT语句不能触发Insert和Update型的触发器。

l  不同的SQL语句,可以触发同一个触发器,如Insert和Update语句都可以激活同一个触发器。

Instead Of触发器的使用范围

Instead Of触发器可以同时在数据表和视图中使用,通常在以下几种情况下,建议使用Instead Of触发器:

l  数据库里的数据禁止修改:例如电信部门的通话记录是不能修改的,一旦修改,则通话费用的计数将不正确。在这个时候,就可以用Instead Of触发器来跳过Update修改记录的SQL语句。

l  有可能要回滚修改的SQL语句:如11.5.3节中的例二,用After触发器并不是一个最好的方法,如果用Instead Of触发器,在判断折扣大于0.6时,就中止了更新操作,避免在修改数据之后再回滚操作,减少服务器负担。

l  在视图中使用触发器:因为After触发器不能在视图中使用,如果想在视图中使用触发器,就只能用Instead Of触发器。

l  用自己的方式去修改数据:如不满意SQL直接的修改数据的方式,可用Instead Of触发器来控制数据的修改方式和流程。

After和Instead of触发器相关推荐

  1. MySQL 学习笔记(8)— 触发器

    1. 触发器概念 触发器是 MySQL 响应以下任意语句而自动执行的一条 MySQL 语句(或位于BEGIN 和 END 语句之间的一组语句) INSERT UPDATE DELETE 其他 MySQ ...

  2. Oracle 触发器 Update 不能操作本表的疑问

    今天要解决一个需求,类似表A有个字段叫flag存储的是0 or  1 ,当一行记录更改为1的时候,其他行同字段要变为0. 这样的需求第一个思路想尝试下能否用触发器来实现 create or repla ...

  3. SQL SERVER 触发器示例

    触发器是一种特殊的存储过程. 触发器语法 : CREATE TRIGGER trigger_name ON { table | view } [ WITH ENCRYPTION ] { FOR | A ...

  4. mysql触发器菜鸟_mysql触发器学习

    创建一个触发器 语法:create trigger 触发器名字create trigger xiaoshou_update_trigger after update on xiaoshou for e ...

  5. 【Postgresql】触发器某个字段更新时执行,行插入或更新执行

    [Postgresql]触发器某个字段更新时执行,行插入或更新执行 1. postgresql触发器 2. 触发器的创建及示例 1) 字段更新时,触发 2) 行插入或更新时,触发 3. 触发器的删除 ...

  6. 数据库实验:数据库和表、查询、视图与安全性、存储过程及游标、触发器、综合实验-水果商店进阶

    数据库实验:数据库和表.查询.视图与安全性.存储过程及游标.触发器.综合实验-水果商店进阶 实验一.数据库和表 源码1: 源码2: 小结 实验二.查询 源码 小结 实验三.视图.安全性 源码: 小结 ...

  7. Sqlserver的触发器的简单使用

    1,触发器有两种 (1)After触发器(之后触发) 触发器有个好处:就是你之前有过什么操作他会将你的操作的数据信息完整的保存下来,比如你删过什么信息,如果用触发器,那么删除后就会显示两行受影响,那么 ...

  8. 实验6 触发器的使用

    实验6 触发器的使用 实验目的 掌握触发器的创建.修改和删除操作. 掌握触发器的触发执行. 掌握触发器与约束的不同. 二.实验要求 1.创建触发器. 2.触发器执行触发器. 3.验证约束与触发器的不同 ...

  9. Sql Server 因为触发器问题导致数据库更新报错“在触发器执行过程中引发了错误,批处理已中止”的问题处理...

    在维护一个非常旧的项目时,由于该项目版本已经非常老了,而且在客户现场运行的非常稳定,更要命的是本人目前没有找到该项目的代码,为了处理一个新的需求而且还不能修改程序代码,于是决定从数据库入手,毕竟该项目 ...

  10. 利用MySQL触发器实现check和assertion

    MySQL虽然输入check语句不会报错,但是实际上并没有check的功能.但是MySQL 依然可以利用触发器来实现相应功能. 本文将根据两个例子简要阐述MySQL实现check和assertion的 ...

最新文章

  1. 降低噪声和电磁干扰的原则
  2. sysdba,sysoper,normal 以及sys,sysdba,dba概念区别
  3. Python学习笔记之爬取网页保存到本地文件
  4. 【转载】Apache Spark Jobs 性能调优(二)
  5. 重磅!2K图像90FPS,中科院开源轻量级通用人脸检测器
  6. 邮箱无权访问 上的 jira是怎么回事_蚂蚁庄园答案2020年11月6日汇总 小鸡宝宝考考你每日答案为你呈上|蚂蚁|庄园-360GAME...
  7. PHP遍历文件夹下所有文件
  8. java 断点续传 开源_java断点续传后台代码
  9. mysql 中ak_数据库ak
  10. GAMES101 Rasteriztion
  11. retainAll用法
  12. 【小镇的技术天梯】黑客技术(1) MITM-中间人攻击
  13. golang实现人民币小写转大写
  14. 阿里品牌数据品牌银行分析师认证真题资料库整理答案
  15. 揭秘郭盛华的真实收入,事实和你想的真不一样
  16. php 判断白天黑夜
  17. 【CSDN】【自用】CSDN操作
  18. Java游戏开发 —— 象棋
  19. 评估通用社区测试计划的性能并预测结果
  20. Linux下重启磁盘盘符会变,linux系统 重启盘符错乱问题

热门文章

  1. QT Designer中编辑菜单栏技巧
  2. 逻辑思维与写作-第一章,第二章-随笔笔记
  3. 小仲马《茶花女》读后感
  4. java全栈工程师进阶路线
  5. 怎么把文件word转换成pdf格式
  6. mysql查询图书复本量_SQL语句在图书管理数据库中实现下列查询S1:在借阅表中查询哪些 爱问知识人...
  7. 全球及中国石油天然气开采行业产量情况及十四五开发战略规划报告2021年版
  8. 试图将一个数学定理证明到最底层的数哲原理...
  9. VC++ 查看系统进程,获取进程关联的DLL列表
  10. LOJ10068 秘密的牛奶运输