在触发器的设计当中,有很多的同学总是不了解怎样善用触发器来解决问题,其实问题在于他们不理解触发器最重要的两个表:inserted表和deleted表,假如你理解这两表的话,许多关于的触发器的问题就迎刃而解啦!

但是同时该如何理解这两个表呢?接下来通过几个实例来介绍这两个表的!

一:

1.如果我更改了学生的学号,我希望他的借书记录仍然与这个学生相关(也就是同时更改借书记录表的学号);

创建一个Update触发器:

Create Trigger truStudent
        On Student                        --在Student表中创建触发器
       for Update                         --为什么事件触发
      As                                       --事件触发后所要做的事情
      if Update(StudentID)        - 判断语句学生的学号更改时  
      begin
        Update BorrowRecord     -学生的借书记录表
     Set StudentID=i.StudentID -让学号等于新插入的学号(inserted表)
       From BorrowRecord br , Deleted  d ,Inserted i     --Deleted和Inserted临时表
          Where br.StudentID=d.StudentID-要修改那个学生的学号?就要看删除的是那个学号啦

end

 通过上面的断句解释是不是对于这两个表有一点的了解呢>

其实抽象点来说修改表的记录无非就涉及到两个动作:第一就是先删除要修改表的关键字段 接着在插入你想要的字段。这也就充分的介绍了deleted表和inserted表啦

       2.如果该学生已经毕业,我希望删除他的学号的同时,也删除它的借书记录。

这个问题就相当容易啦 具体如何做看代码自己理解啦

Create trigger trdStudent
      On Student
      for Delete
     As
      Delete BorrowRecord 
        From BorrowRecord br , Delted d
        Where br.StudentID=d.StudentID
上面的两个例子比较容易理解,但是要想更加理解触发器的功能,这两个实例肯定不够的,接着我就引用其他的实例来介绍触发器的强大的功能!

二:订单出货时要用到触发器,所以这两天现学现写了两个触发器,测试通过,但总觉得代码不太优美,应该可以写得更好,看看大家有什么看法或意见:
--当在“出货表_明细”增、删、改时,相应地在“订单表_明细”对已交货数量和未交货数量作出修改。
Create trigger tr_出货表_明细
on 出货表_明细
For DELETE,INSERT,UPDATE
as
Declare @JiaoHuo varchar(20)
Begin
 Set @JiaoHuo = (Select Sum(交货数量) from 出货表_明细 Group by 序号 Having 序号 = (Select 序号 From Deleted))
 Set @JiaoHuo = ISNULL(@JiaoHuo,(Select Sum(交货数量) from 出货表_明细 Group by 序号 Having 序号 = (Select 序号 From Inserted)))
        Set @JiaoHuo = ISNULL(@JiaoHuo,0)
 UPDATE N SET 已交货数量 = @JiaoHuo, 未交货数量 = N.订购数量 - @JiaoHuo
                From 订单表_明细 AS N INNER Join Deleted AS D
      ON N.序号 = D.序号
End
--当“订单表_明细”中增、删、改时、判断该笔订单的未交货数量合计是否为0,修改“订单表”的订单状态为“已完成”,否则为“未完成”
Create trigger tr_Status
ON 订单表_明细
FOR INSERT,UPDATE,DELETE
AS
Declare @Order varchar(20)
 Begin
         Set @Order = (Select 订单号 from Deleted)
         Set @Order = ISNULL(@Order,(Select 订单号 from Inserted))
         IF(Select Sum(未交货数量) From 订单表_明细 Group by 订单号 Having 订单号 = @Order)= 0 
              Begin 
                   UPDATE 订单表 Set 订单状态 = '已完成',完成日期 = GetDate() Where 订单号 = @Order
              End
         Else
              Begin  
                   UPDATE 订单表 Set 订单状态 = '未完成',完成日期 = NUll Where 订单号 = @Order
              End
 End
======================================================================
--出货表_明细
CREATE TABLE [出货表_明细] (
 [序号] [int] NULL ,
 [订单号] [varchar] (20) COLLATE Chinese_PRC_CI_AS NULL ,
 [ID] [int] IDENTITY (1, 1) NOT NULL ,
 [出货单号] [varchar] (20) COLLATE Chinese_PRC_CI_AS NULL ,
 [料号] [varchar] (20) COLLATE Chinese_PRC_CI_AS NULL ,
 [品名_1] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
 [品名_2] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
 [批号] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
 [单位] [varchar] (10) COLLATE Chinese_PRC_CI_AS NULL ,
 [规格型号] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
 [交货数量] [int] NULL ,
 [交货情况] [varchar] (100) COLLATE Chinese_PRC_CI_AS NULL ,
 [客户要求交货期] [datetime] NULL ,
 [预交日期] [datetime] NULL ,
 [交货日期] [datetime] NULL ,
 [sysRowInfo] [text] COLLATE Chinese_PRC_CI_AS NULL ,
 CONSTRAINT [PK_出货表_明细] PRIMARY KEY  CLUSTERED
 (
  [ID]
 )  ON [PRIMARY] ,
 CONSTRAINT [FK_出货表_出货表_明细] FOREIGN KEY
 (
  [出货单号]
 ) REFERENCES [出货表] (
  [出货单号]
 ) ON DELETE CASCADE  ON UPDATE CASCADE
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO
--订单表
CREATE TABLE [订单表] (
 [订单号] [varchar] (20) COLLATE Chinese_PRC_CI_AS NOT NULL ,
 [客户编号] [varchar] (20) COLLATE Chinese_PRC_CI_AS NULL ,
 [客户名称] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
 [下单日期] [datetime] NULL ,
 [签收日期] [datetime] NULL ,
 [接单业务员] [varchar] (20) COLLATE Chinese_PRC_CI_AS NULL ,
 [客户要求完成日期] [datetime] NULL ,
 [完成日期] [datetime] NULL ,
 [订单状态] [varchar] (20) COLLATE Chinese_PRC_CI_AS NULL ,
 [总金额] [money] NULL ,
 [出货人] [varchar] (20) COLLATE Chinese_PRC_CI_AS NULL ,
 [收货地址] [varchar] (100) COLLATE Chinese_PRC_CI_AS NULL ,
 [收货人] [varchar] (20) COLLATE Chinese_PRC_CI_AS NULL ,
 [备注] [varchar] (255) COLLATE Chinese_PRC_CI_AS NULL ,
 [sysRowInfo] [text] COLLATE Chinese_PRC_CI_AS NULL ,
 CONSTRAINT [PK_订单表] PRIMARY KEY  CLUSTERED
 (
  [订单号]
 )  ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO
--订单表_明细
CREATE TABLE [订单表_明细] (
 [序号] [int] IDENTITY (1, 1) NOT NULL ,
 [订单号] [varchar] (20) COLLATE Chinese_PRC_CI_AS NOT NULL ,
 [料号] [varchar] (20) COLLATE Chinese_PRC_CI_AS NULL ,
 [品名_1] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
 [品名_2] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
 [批号] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
 [单位] [varchar] (10) COLLATE Chinese_PRC_CI_AS NULL ,
 [规格型号] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
 [订购数量] [int] NULL ,
 [已交货数量] [int] NULL ,
 [未交货数量] [int] NULL ,
 [单价] [money] NULL ,
 [合计金额] [money] NULL ,
 [客户要求交货期] [datetime] NULL ,
 [预交日期] [datetime] NULL ,
 [sysRowInfo] [text] COLLATE Chinese_PRC_CI_AS NULL ,
 CONSTRAINT [PK_订单表_明细] PRIMARY KEY  CLUSTERED
 (
  [序号]
 )  ON [PRIMARY] ,
 CONSTRAINT [FK_订单表_订单表_明细] FOREIGN KEY
 (
  [订单号]
 ) REFERENCES [订单表] (
  [订单号]
 ) ON DELETE CASCADE  ON UPDATE CASCADE
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO

这两个实例是否很好的体现了触发器的强项呢???

两大实例充分的体现了触发器的用法,deleted表和inserited表的概念也不言而喻了吧,但是要彻底的理解触发器的精髓还需要平时多加训练和理解!

另一方面至于如何使用SQL SERVER 的新增的功能DDL触发器,请关注最近的发表!

技术专题:http://tech.ccidnet.com/zt/chufaqi/

原文地址:http://blog.163.com/fred_chan/blog/static/162906322201051535811546/?fromdm&fromSearch&isFromSearchEngine=yes

转载于:https://www.cnblogs.com/Godblessyou/archive/2010/09/06/1818755.html

(DML触发器)如何正确理解触发器的deleted表和inserted表(转)相关推荐

  1. 触发器deleted 表和 inserted 表详解(转)

    create trigger updateDeleteTime on user for update as begin   update user set UpdateTime=(getdate()) ...

  2. deleted 表和 inserted 表

    触发器语句中使用了两种特殊的表:deleted    表和    inserted    表.Microsoft®    SQL  Server  2000 自动创建和管理这些表.可以使用这两个临时的 ...

  3. MySQL中有inserted表吗_SQL触发器中的inserted表和deleted表

    简介:开发也有年头了,但是触发器确实用的比较少,但是无容置疑触发器确实不错, 最近项目要求需要用到的触发器特别多.频繁,觉得很有必要记录和积累下. 在触发器语句中用两个特殊的表一个是deleted表和 ...

  4. SQL server触发器 inserted表和deleted表用法

    inserted表和deleted表用于存放对表中数据行的修改信息,他们是触发器执行时自动创建的,放在内存中,是临时表.当触发器工作完成,它们也被删除.它们是只读表,不能向它们写入内容. insert ...

  5. mysql inserted表_触发器中的inserted表和deleted表

    触发器语句中使用了两种特殊的表:deleted 表和 inserted 表.Microsoft? SQL Server 2000 自动创建和管理这些表.可以使用这两个临时的驻留内存的表测试某些数据修改 ...

  6. mysql inserted表_数据库触发器inserted和deleted详解

    create trigger updateDeleteTime on user for update as begin update user set UpdateTime=(getdate()) f ...

  7. MySQL中有inserted表吗_使用 inserted 和 deleted 表

    创建和维护数据库 使用 inserted 和 deleted 表 触发器语句中使用了两种特殊的表:deleted 表和 inserted 表.Microsoft® SQL Server™ 2000 自 ...

  8. 在创建触发器时出现不能在 'inserted' 表和 'deleted' 表中使用 text、ntext 或 image 列...

    1. 不能在 'inserted' 表和 'deleted' 表中使用 text.ntext 或 image 列 在 create trigger trg on t1 for update 改成 cr ...

  9. mysql 触发器_进阶msql触发器-指南

    定义: 何为触发器?在SQL Server里面也就是对某一个表的一定的操作,触发某种条件,从而执行的一段程序.触发器是一个特殊的存储过程. 常见的触发器有三种:分别应用于Insert , Update ...

最新文章

  1. java i 原子_为什么i ++不是原子的?
  2. Android实战技巧之三十七:图片的Base64编解码
  3. python 学习笔记 12 -- 写一个脚本获取城市天气信息
  4. CentOS 7 用yum安装 MySQL
  5. Object Builder Application Block (2)
  6. python正则表达式判断数字_Python机器学习之手写数字辨识及正则表达式
  7. mysql 检查_检查MySQL的健康状况
  8. 大学计算机一级b笔记,全国计算机等级一级B Excel考试整理笔记
  9. playframe 项目搭建
  10. linux服务器配置jdk1.8
  11. java redis pipeline,巧用 Redis pipeline 命令,解决真实的生产问题
  12. 设计模式(三)结构型模式
  13. 网页f12查看服务器,网页中审查元素(按F12)与查看网页源代码的区别
  14. html打开网页一段时间字幕滚动,网页代码:求一个隔段时间可停顿的滚动字幕代码...
  15. Mybatis拦截器
  16. java读取excel隐藏列,#用poi做excle导入时怎样判断行是否隐藏#poi excle读出数据
  17. 【机器学习】10:朴素贝叶斯做文本分类
  18. IE11 zh_HANS_CN国际化问题
  19. Oracle数据库练习题(1)
  20. 在计算机英语中memory,memory是什么 memory什么意思

热门文章

  1. Spring Boot修改启动端口
  2. Intersection of Two Linked Lists——经典问题
  3. C/C++动态二维数组的内存分配和释放
  4. ultraMaskedEdit使用心得
  5. POJ 2870 求矩阵的加法
  6. 关于C++中数组下标越界不报错的问题
  7. MATLAB中如何将一幅图像的地理信息写入另一幅图像
  8. 天水师范学院计算机科学与技术专业代码,计算机科学与技术-天水师范学院IPv6专题网站.doc...
  9. spring 数组中随机取几个_游戏编程中需要掌握哪些数学物理知识
  10. 创建程序集时元数据失败 -- 拒绝访问_kubectl 创建 Pod 背后到底发生了什么?