SQL触发器实例讲解2

来源:未知 责任编辑:智问网络 发表时间:2013-10-22 19:27 点击:
 
接(一) http://www.2cto.com/database/201202/120948.html
 
--触发器示例2
 
/*
 
创建触发器[T_INSERT_卷烟销售表],该触发器较复杂。
 
说明: 每当[卷烟库存表]发生INSERT 动作,则引发该触发器。
 
触发器功能: 实现业务规则。
 
业务规则: 如果销售的卷烟品牌不存在库存或者库存为零,则返回错误。
 
否则则自动减少[卷烟库存表]中对应品牌卷烟的库存数量和库存金额。
 
*/
 
IF EXISTS (SELECT NAME FROM SYSOBJECTS WHERE XTYPE = ’TR’AND NAME = ’T_INSERT_卷烟销售表’)
 
DROP TRIGGER T_INSERT_卷烟销售表
 
GO
 
CREATE TRIGGER T_INSERT_卷烟销售表
 
ON 卷烟销售表
 
FOR INSERT
 
AS
 
BEGIN TRANSACTION
 
--检查数据的合法性:销售的卷烟是否有库存,或者库存是否大于零
 
IF NOT EXISTS (
 
SELECT 库存数量
 
FROM 卷烟库存表
 
WHERE 卷烟品牌IN (SELECT 卷烟品牌FROM INSERTED)
 
)
 
BEGIN
 
--返回错误提示
 
RAISERROR(’错误!该卷烟不存在库存,不能销售。’,16,1)
 
--回滚事务
 
ROLLBACK
 
RETURN
 
END
 
IF EXISTS (
 
SELECT 库存数量
 
FROM 卷烟库存表
 
WHERE 卷烟品牌IN (SELECT 卷烟品牌FROM INSERTED) AND
 
库存数量<= 0
 
)
 
BEGIN
 
--返回错误提示
 
RAISERROR(’错误!该卷烟库存小于等于0,不能销售。’,16,1)
 
--回滚事务
 
ROLLBACK
 
RETURN
 
END
 
--对合法的数据进行处理
 
--强制执行下列语句,保证业务规则
 
UPDATE 卷烟销售表
 
SET 销售金额= 销售数量* 销售单价
 
WHERE 卷烟品牌IN (SELECT 卷烟品牌FROM INSERTED)
 
DECLARE @卷烟品牌VARCHAR(40)
 
SET @卷烟品牌= (SELECT 卷烟品牌FROM INSERTED)
 
DECLARE @销售数量MONEY
 
SET @销售数量= (SELECT 销售数量FROM INSERTED)
 
UPDATE 卷烟库存表
 
SET 库存数量= 库存数量- @销售数量,
 
库存金额= (库存数量- @销售数量)*库存单价
 
WHERE 卷烟品牌= @卷烟品牌
 
COMMIT TRANSACTION
 
GO
 
--请大家自行跟踪[卷烟库存表]和[卷烟销售表]的数据变化。
 
--针对[卷烟销售表],插入第一条测试数据,该数据是正常的。
 
INSERT INTO 卷烟销售表(卷烟品牌,购货商,销售数量,销售单价,销售金额)
 
SELECT ’红塔山新势力’,’某购货商’,10,12,1200
 
GO
 
--针对[卷烟销售表],插入第二条测试数据,该数据 销售金额 不等于 销售单价* 销售数量。
 
--触发器将自动更正数据,使 销售金额 等于 销售单价* 销售数量。
 
INSERT INTO 卷烟销售表(卷烟品牌,购货商,销售数量,销售单价,销售金额)
 
SELECT ’红塔山人为峰’,’某购货商’,10,22,2000
 
GO


作者 蚂蚁跳楼
    发表评论
    请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
    用户名: 验证码:点击我更换图片
    最新评论 更多>>

    推荐热点

    • sql常见面试题
    • SQL SERVER 2005性能之跟踪
    • SQL编程(一)
    • LINUX上RMAN自动备份脚本
    • sql server面试题
    • 浅谈SQL Server中的事务日志(三)----在简单恢复模式下日志的角色
    • 如何将多个SQL查询统计结果一次显示出来
    • SQL小技巧系列 --- 行转列合并
    • sql server 列转行
    网站首页 - 友情链接 - 网站地图 - TAG标签 - RSS订阅 - 内容搜索
    Copyright © 2008-2015 计算机技术学习交流网. 版权所有

    豫ICP备11007008号-1