创建触发器 是特殊的存储过程,自动执行,一般不要有返回值

类型:

  1.后触发器 (AFTER,FOR)先执行对应语句,后执行触发器中的语句

  2.前触发器  并没有真正的执行触发语句(insert,update,delete),而是执行触发后的语句

  3.行级触发器 (FOR EACH ROW) 在SQL server 中不存在

商品号为1的库存量:

1.后触发器(实现不同表之间的约束)

--实现在销售量不大于库存量时,每卖出n件商品,对应商品的库存要减n,若销售量大于库存量,则回滚此次操作
IF EXISTS (SELECT *FROM sysobjects WHERE name='tr_SaleCommodity')DROP TRIGGER tr_SaleCommodity
GO
CREATE TRIGGER tr_SaleCommodity
ON OrderInfo FOR INSERT  --FOR/AFTER为后触发器
ASBEGINIF EXISTS (SELECT  * FROM inserted I INNER JOIN CommodityInfo C ON I.CommodityId=C.CommodityIdWHERE I.Amount>C.Amount)BEGINROLLBACK  --后触发器PRINT '商品的销售量大于商品的库存量'END    ELSEBEGINUPDATE CommodityInfoSET Amount=Amount-(SELECT Amount FROM inserted)WHERE CommodityId IN(SELECT CommodityId FROM inserted)ENDEND
GO

执行:

INSERT INTO OrderInfo(UserId,CommodityId,Amount,PayMoney,PayWay,OrderTime,Confirm,SendGoods)
VALUES('YOUYOU',1,10,600,'网上银行','2014-11-11 00:00:00.000',1,1)

结果:

  注意:1.上一行为销售记录,下一行为商品1的信息

     2.卖出10个,库存量由48变为38 

       3.可以看出以上的销售记录中的Paymoney是不正确的,它的值应该是Amount*OutPrice=10*300,所以需要前触发器来约束

2.前触发器(可以实现行级触发器功能)

--实现了日期校验和支付金额的计算
IF EXISTS(SELECT* FROM sysobjects WHERE name='tr_DateConfim')DROP TRIGGER tr_DateConfim
GO
CREATE TRIGGER tr_DateConfim
ON OrderInfo INSTEAD OF INSERT ,UPDATE
ASBEGINDECLARE @date datetimeSELECT @date=OrderTime FROM insertedIF @date BETWEEN '2012-1-1' AND '2015-1-1'BEGINDECLARE @UserId varchar(20) ,@CommodityId int,@Amount int,@PayMoney money,@PayWay varchar(20),@OrderTime datetime,@Confirm int,@SendGoods intSELECT @UserId=UserId,@CommodityId=CommodityId,@Amount=Amount,@PayWay=PayWay,@OrderTime=OrderTime,@Confirm=Confirm,@SendGoods=SendGoods FROM insertedDECLARE @outPrice moneySELECT @outPrice=OutPrice FROM CommodityInfo WHERE CommodityId=@CommodityIdSET @PayMoney=@outPrice*@AmountPRINT 'inserted 中的数据:'+CONVERT(varchar(20),@UserId)+' '+CONVERT(varchar(20),@CommodityId)+' '+CONVERT(varchar(20),@Amount)+' '+CONVERT(varchar(20),@PayMoney)+' '+CONVERT(varchar(20),@PayWay)+' '+CONVERT(varchar(20),@OrderTime)+' '+CONVERT(varchar(20),@Confirm)+' '+CONVERT(varchar(20),@SendGoods)+' '+CONVERT(varchar(20),@outPrice)INSERT INTO OrderInfo(UserId,CommodityId,Amount,PayMoney,PayWay,OrderTime,Confirm,SendGoods)SELECT UserId,CommodityId,Amount,@PayMoney,PayWay,OrderTime,Confirm,SendGoods FROM insertedENDELSE PRINT '你插入的数据中的时间只能在 2012-1-1 到 2015-1-1 中间'END
GO

执行:

INSERT INTO OrderInfo(UserId,CommodityId,Amount,PayWay,OrderTime,Confirm,SendGoods)
VALUES('YOUYOU',1,5,'网上银行','2013-1-11',1,1)

   注意:这里插入时我并没有定义PayMoney,PayMoney是通过触发器来自动计算的

结果:

日期不正确:

日期正确:

打印信息对应:@UserId+' '+@CommodityId+' '+@Amount+' '+@PayMoney+' '+@PayWay+' '@OrderTime+' '@Confirm+' '+@SendGoods+' '@outPrice

3.行级触发器(错误)

  

执行结果:

可以看出在SQL server中并不支持行级触发器

转载于:https://www.cnblogs.com/feiquan/p/8685722.html

SQL中触发器的使用相关推荐

  1. SQL中触发器实例讲解(转)

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

  2. 什么是存储过程?什么是触发器?SQL中存储过程与触发器的区别是什么?

    什么是存储过程?什么是触发器?SQL中存储过程与触发器的区别是什么? 存储过程是在大型数据库系统中,一组为了完成特定功能的SQL 语句集,它存储在数据库中,一次编译后永久有效,用户通过指定存储过程的名 ...

  3. SQL server触发器中 update insert delete 分别给写个例子被。

    SQL server触发器中 update insert delete 分别给写个例子以及解释下例子的作用和意思被, 万分感谢!!!! 主要想知道下各个语句的书写规范. INSERT: 表1 (ID, ...

  4. 了解SQL Server触发器及触发器中的事务

    引述 首先,写这篇文章的目的是望能把我对触发器的理解,分享出来与大家一起学习.如果你对触发器和事务的概念有些了解,这篇文章对你来说会是很简单,或能让你更进一步的了解触发器里面的一些故事,以及触发器中事 ...

  5. 【转】了解SQL Server触发器及触发器中的事务

    引述 首先, 说下我写篇文章的目的,我希望能把我对触发器的理解,分享出来与你一起学习.如果你有对触发器和事务的概念,有些了解,这篇文章,对你来说会是很简单,或能让你更进一步的了解触发器里面的一些故事, ...

  6. 关于SQL中的触发器(数据库)

    关于在SQL中的触发器相关知识(就业面试题库.数据库) 1.触发器是什么? 触发器是一个特殊的存储过程,它被捆绑在SQL的表格或者视图上. 它不能直接调用,主要通过事件来触发,而被被动的执行. ps: ...

  7. SQL中的触发器是什么?

    可以简单的理解:相当于是一个时间的触发装置,当满足了触发事件的条件后进行相应的处理操作,例如在数据库表中增加或者删除.修改了某条记录后,输出消息来告知该操作.这样就可以在这个表上设置一个触发器,触发条 ...

  8. SQL Server 触发器学习总结

    SQL菜鸟入门级教程之触发器 触发器简介:   触发器(trigger)是种特殊的存储过程,它的执行不是由程序调用,也不需要手动操作,它是由事件来触发,事件大家应该非常熟悉吧,比如按钮的Click事件 ...

  9. (2.13)Mysql之SQL基础——触发器

    (2.13)Mysql之SQL基础--触发器 关键词:Mysql触发器 二.触发器 MySQL语句在需要时被执行,存储过程也是如此,如果希望某条语句(或某些语句)在事件发生时自动执行,这就需要用到触发 ...

最新文章

  1. 继LSTM之父用世界模型来模拟2D赛车后,谷歌又推出全新世界模型助力导航:360度无死角,就问你怕了没?...
  2. Spring Data(二)查询
  3. arthas 查看哪个方法调用最耗时_Arthas实战
  4. StoryBoard解惑
  5. 7-24 树种统计 (25 分)(详解)map做法 map真香啊!
  6. 开发人员也要懂点的测试知识
  7. HTML中各种 div 位置距离关系
  8. c语言学习-从键盘上输入100个字符,统计其中字母、每个数字和其它字符的个数及其百分比
  9. openGauss 正式开源并成立开源社区
  10. Linux:修改文件权限命令chmod
  11. [转]jQuery: how to get which button was clicked upon form submission?
  12. 38 | 测试数据的“银弹”- 统一测试数据平台(下)
  13. 《算法图解》第八章贪婪算法
  14. 高等数学导数公式、微分公式和积分公式大全
  15. pr人像磨皮美容插件:Beauty Box for Premiere Pro
  16. 记账系统推荐金蝶精斗云_金蝶精斗云财务软件免费版本在哪里体验?
  17. 微软必应词典案例分析
  18. 百度网盘链接提取码接口实现
  19. java 记牌_JAVA入门之简易扑克牌游戏
  20. 世界线(bzoj2894)(广义后缀自动机)

热门文章

  1. c语言程序设计王新萍课后答案,C语言程序设计教程
  2. java 基础面试 英文_[Java面试] 面试java基础总结大全
  3. 重新加一个window_Activity、View、Window关系,进程间通信,责任链模式,Https,数据存储...
  4. css 超出文字头尾相接滚动_前端的一些雕虫小技,从100%和滚动条说起
  5. Idea运行项目报错:java.lang.OutOfMemoryError: Java heap space/ java.lang.OutOfMemoryError: GC overhead 解决方法
  6. docker镜像为什么要采用分层结构
  7. 虚拟化运维平台云安对政府机构的解决方案
  8. 这份网约车安全乘车指南,请务必收下!
  9. 腾讯、阿里、网易、杰士邦等30家中秋月饼设计盘点!(完整版)
  10. 11 个 Linux 上最佳的图形化 Git 客户端