zoukankan      html  css  js  c++  java
  • SQL DML触发器原理

    在SQL Server 2005里,为每个DML触发器都定义了两个特殊的表,一个是插入表,一个是删除表。这两个表是建在数据库服务器的内存中的,是由系统管理的逻辑表,而不是真正存储在数据库中的物理表。对于这两个表,用户只有读取的权限,没有修改的权限。

    这两个表的结构与触发器所在数据表的结构是完全一致的,当触发器的工作完成之后,这两个表也将会从内存中删除。

    插入表里存放的是更新前的记录:对于插入记录操作来说,插入表里存放的是要插入的数据;对于更新记录操作来说,插入表里存放的是要更新的记录。

    删除表里存放的是更新后的记录:对于更新记录操作来说,删除表里存放的是更新前的记录(更新完后即被删除);对于删除记录操作来说,删除表里存入的是被删除的旧记录。

    下面看一下触发器的工作原理。

    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语句。

  • 相关阅读:
    黑马程序员文件流的写入
    SCOPE_IDENTITY()代替 @@IDENTITY
    Asp.net 常用的正则表达式汇集
    jquery工作小笔记:jquery获取页面上控件的值
    将公历转换成农历的类_C#
    数字人民币(RMB)转化为大写字母
    常用JS判断各种格式,以及替换函数等
    iis预览.net发布的网站时遇到的莫名问题:无资源行。
    sql 自动补位
    switchhost引发的问题
  • 原文地址:https://www.cnblogs.com/wangshuai/p/1635706.html
Copyright © 2011-2022 走看看