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

类型:

  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为后触发器
AS
BEGIN
IF EXISTS (
SELECT * FROM inserted I INNER JOIN CommodityInfo C ON I.CommodityId=C.CommodityId
WHERE I.Amount>C.Amount
)
BEGIN
ROLLBACK --后触发器
PRINT '商品的销售量大于商品的库存量'
END
ELSE
BEGIN
UPDATE CommodityInfo
SET Amount=Amount-(SELECT Amount FROM inserted)
WHERE CommodityId IN
(
SELECT CommodityId FROM inserted
)
END
END
GO

执行:

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

结果:

  注意: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
AS
BEGIN
DECLARE @date datetime
SELECT @date=OrderTime FROM inserted
IF @date BETWEEN '2012-1-1' AND '2015-1-1'
BEGIN
DECLARE @UserId varchar() ,@CommodityId int,@Amount int,@PayMoney money,@PayWay varchar(),@OrderTime datetime,@Confirm int,@SendGoods int
SELECT @UserId=UserId,@CommodityId=CommodityId,@Amount=Amount,@PayWay=PayWay,@OrderTime=OrderTime,@Confirm=Confirm,@SendGoods=SendGoods FROM inserted
DECLARE @outPrice money
SELECT @outPrice=OutPrice FROM CommodityInfo WHERE CommodityId=@CommodityId
SET @PayMoney=@outPrice*@Amount
PRINT 'inserted 中的数据:'+CONVERT(varchar(),@UserId)+' '+CONVERT(varchar(),@CommodityId)+' '+CONVERT(varchar(),@Amount)+' '+CONVERT(varchar(),@PayMoney)+' '+CONVERT(varchar(),@PayWay)+' '+CONVERT(varchar(),@OrderTime)+' '+CONVERT(varchar(),@Confirm)+' '+CONVERT(varchar(),@SendGoods)+' '+CONVERT(varchar(),@outPrice)
INSERT INTO OrderInfo(UserId,CommodityId,Amount,PayMoney,PayWay,OrderTime,Confirm,SendGoods)
SELECT UserId,CommodityId,Amount,@PayMoney,PayWay,OrderTime,Confirm,SendGoods FROM inserted
END
ELSE
PRINT '你插入的数据中的时间只能在 2012-1-1 到 2015-1-1 中间'
END
GO

执行:

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

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

结果:

日期不正确:

日期正确:

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

3.行级触发器(错误)

  

执行结果:

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

SQL中触发器的使用的更多相关文章

  1. SQL中约束和触发器的停用与启用

    如何对SQL中的约束和触发器进行停用与启用,如果有外键约束则相关联表都要进行相应操作. ALTER TABLE TableName CHECK CONSTRAIT ALL --检查约束 ALTER T ...

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

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

  3. 在Sql Server触发器中判断操作是Insert还是Update还是Delete

    在Sql Server触发器中判断操作是Insert还是Update还是Delete DECLARE    @IsInsert bit,    @IsUpdate bit,    @IsDelete  ...

  4. sql server中触发器

    触发器是一种特殊类型的存储过程,它不同于之前的我们介绍的存储过程.触发器主要是通过事件进行触发被自动调用执行的.而存储过程可以通过存储过程的名称被调用. Ø 什么是触发器 触发器对表进行插入.更新.删 ...

  5. SQL Server 触发器

    触发器是一种特殊类型的存储过程,它不同于之前的我们介绍的存储过程.触发器主要是通过事件进行触发被自动调用执行的.而存储过程可以通过存储过程的名称被调用. Ø 什么是触发器 触发器对表进行插入.更新.删 ...

  6. [SQL] SQL Server 触发器

    触发器是一种特殊类型的存储过程,它不同于之前的我们介绍的存储过程.触发器主要是通过事件进行触发被自动调用执行的.而存储过程可以通过存储过程的名称被调用. Ø 什么是触发器 触发器对表进行插入.更新.删 ...

  7. SQL Server 触发器(转)

    触发器是一种特殊类型的存储过程,它不同于之前的我们介绍的存储过程.触发器主要是通过事件进行触发被自动调用执行的.而存储过程可以通过存储过程的名称被调用. Ø 什么是触发器 触发器对表进行插入.更新.删 ...

  8. SQL Server 触发器【转】

    触发器是一种特殊类型的存储过程,它不同于之前的我们介绍的存储过程.触发器主要是通过事件进行触发被自动调用执行的.而存储过程可以通过存储过程的名称被调用. Ø 什么是触发器 触发器对表进行插入.更新.删 ...

  9. SQL中删除某数据库所有trigger及sp

    SQL中删除某数据库所有trigger及sp   编写人:CC阿爸 2014-6-14 在日常SQL数据库的操作中,如何快速的删除所有trigger及sp呢 以下有三种方式可快速处理. --第一种 - ...

随机推荐

  1. spring-boot-starter大力出奇迹

    一.前言 ​ 上篇文章我们已经聊了SpringBoot的启动过程中的各类扩展点,那么从http://start.spring.io上我们生成的demo项目中,到目前就剩下了maven工程的pom.xm ...

  2. 【原创】Python第一章

    Python总是从第一行代码开始逐步执行,而C是从main函数开始执行.       在Python中,一切东西都是对象.   在Python中,没有C的花括号,不能任意排版,属于同一个语句块的语句需 ...

  3. CSS实例详解:Flex布局

    本文由云+社区发表 本文将通过三个简单的实例,实际应用上篇文章的基础理论知识,展示下Flex布局是如何解决CSS布局问题. 一.垂直居中 这里同时用非flex布局和flex布局两种方式来实现,可以对比 ...

  4. python闯关之路(五)前端开发

    一,HTML部分 1,XHTML和HTML有什么区别 HTML是一种基本的WEB网页设计语言,XHTML是一个基于XML的置标语言最主要的不同: XHTML 元素必须被正确地嵌套. XHTML 元素必 ...

  5. 飞跃式发展的后现代 Python 世界

    飞跃式发展的后现代Python世界 如果现代Python有一个标志性特性,那么简单说来便是Python对自身定义的越来越模糊.在过去的几年的许多项目都极大拓展了Python,并重建了“Python”本 ...

  6. Hyperledger Fabric链码之二

    上篇文章中我们介绍了链码的概念,本文中我们将介绍Fabric下链码的编写和测试.我们会通过一个简单例子的方式来阐述链码API的使用. 链码API     每一个链码程序都必须实现一个接口Chainco ...

  7. Spring Cloud Stream如何消费自己生产的消息?

    在上一篇<Spring Cloud Stream如何处理消息重复消费>中,我们通过消费组的配置解决了多实例部署情况下消息重复消费这一入门时的常见问题.本文将继续说说在另外一个被经常问到的问 ...

  8. Apollo 10 — adminService 全量发布

    目录 UI 界面 Portal 服务 admin 服务 总结 1. UI 界面 2. Portal 服务 当我们点击上面的发布按钮的时候,调用的当然是 portal 的接口.具体代码如下: /** * ...

  9. html中的Session

    采用setItem()方法存储 sessionStorage.setItem('testKey','这是一个测试的value值'); // 存入一个值sessionStorage.getItem('t ...

  10. nginx支持跨域访问

    1,进入nginx的html目录 vim ./crossdomain.xml 具体路径: /usr/local/nginx/html/crossdomain.xml 2,在crossdomain.xm ...