SQL中触发器的使用
创建触发器 是特殊的存储过程,自动执行,一般不要有返回值
类型:
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中触发器的使用的更多相关文章
- SQL中约束和触发器的停用与启用
如何对SQL中的约束和触发器进行停用与启用,如果有外键约束则相关联表都要进行相应操作. ALTER TABLE TableName CHECK CONSTRAIT ALL --检查约束 ALTER T ...
- SQL server触发器中 update insert delete 分别给写个例子被。
SQL server触发器中 update insert delete 分别给写个例子以及解释下例子的作用和意思被, 万分感谢!!!! 主要想知道下各个语句的书写规范. INSERT: 表1 (ID, ...
- 在Sql Server触发器中判断操作是Insert还是Update还是Delete
在Sql Server触发器中判断操作是Insert还是Update还是Delete DECLARE @IsInsert bit, @IsUpdate bit, @IsDelete ...
- sql server中触发器
触发器是一种特殊类型的存储过程,它不同于之前的我们介绍的存储过程.触发器主要是通过事件进行触发被自动调用执行的.而存储过程可以通过存储过程的名称被调用. Ø 什么是触发器 触发器对表进行插入.更新.删 ...
- SQL Server 触发器
触发器是一种特殊类型的存储过程,它不同于之前的我们介绍的存储过程.触发器主要是通过事件进行触发被自动调用执行的.而存储过程可以通过存储过程的名称被调用. Ø 什么是触发器 触发器对表进行插入.更新.删 ...
- [SQL] SQL Server 触发器
触发器是一种特殊类型的存储过程,它不同于之前的我们介绍的存储过程.触发器主要是通过事件进行触发被自动调用执行的.而存储过程可以通过存储过程的名称被调用. Ø 什么是触发器 触发器对表进行插入.更新.删 ...
- SQL Server 触发器(转)
触发器是一种特殊类型的存储过程,它不同于之前的我们介绍的存储过程.触发器主要是通过事件进行触发被自动调用执行的.而存储过程可以通过存储过程的名称被调用. Ø 什么是触发器 触发器对表进行插入.更新.删 ...
- SQL Server 触发器【转】
触发器是一种特殊类型的存储过程,它不同于之前的我们介绍的存储过程.触发器主要是通过事件进行触发被自动调用执行的.而存储过程可以通过存储过程的名称被调用. Ø 什么是触发器 触发器对表进行插入.更新.删 ...
- SQL中删除某数据库所有trigger及sp
SQL中删除某数据库所有trigger及sp 编写人:CC阿爸 2014-6-14 在日常SQL数据库的操作中,如何快速的删除所有trigger及sp呢 以下有三种方式可快速处理. --第一种 - ...
随机推荐
- [Maven]Maven如何得到单独的单元测试报告
----------------------------------------------------------------- 原创博文,如需转载请通知作者并注明出处! 博主:疲惫的豆豆 链接:h ...
- [WebKit内核] JavaScriptCore深度解析--基础篇(一)字节码生成及语法树的构建
看到HorkeyChen写的文章<[WebKit] JavaScriptCore解析--基础篇(三)从脚本代码到JIT编译的代码实现>,写的很好,深受启发.想补充一些Horkey没有写到的 ...
- C#系列之聊聊.Net Core的InMemoryCache
作者:暴王 个人博客:http://www.boydwang.com/2017/12/net-core-in-memory-cache/ 这两天在看.net core的in memory cache, ...
- 聊聊Flexbox布局中的flex的演算法
到目前为止,Flexbox布局应该是目前最流行的布局方式之一了.而Flexbox布局的最大特性就是让Flex项目可伸缩,也就是让Flex项目的宽度和高度可以自动填充Flex容器剩余的空间或者缩小Fle ...
- spring学习(一) ———— IOC讲解
spring基本就两个核心内容,IOC和AOP.把这两个学会了基本上就会用了. --WH 一.什么是IOC? IOC:控制反转,通俗点讲,将对象的创建权交给spring,我们需要new对象,则由spr ...
- python下载安装requests库
一.python下载安装requests库 1.到git下载源码zip源码https://github.com/requests/requests 2.解压到python目录下: 3.“win+R”进 ...
- Map相关知识总结
Map主要用于存储健值对,根据键得到值,因此不允许键重复(重复了覆盖了),但允许值重复. Hashmap 是一个最常用的Map,它根据键的HashCode 值存储数据,根据键可以直接获取它的值,具有很 ...
- C#计算字符串长度,汉字算两个字符
在C#中的字符串类String中,有个Length属性表示字符串的长度,但该字段返回的是字符的个数,如果字符串中含有中文字符的话,一个汉字占用两个字符的长度,此时获取的长度就不够精确,当然也看具体业务 ...
- 在Azure虚拟机上部署FileZilla FTP服务器
1.开始之前准备的软件 ①一台Azure虚拟机 ②FileZilla服务端安装包 我这边是windows的所以 给个链接 https://filezilla-project.org/download. ...
- Linux学习笔记之基本指令
1.ll 注:详细展示当前文件夹下的所有文件及目录 ,与 ls -al 有异曲同工的作用 2.free -m/-h 注:-m:显示当前的内存信息,-m表示以MB为单位显示:-h:以人类能读懂的形式显 ...