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
作者 蚂蚁跳楼
相关新闻>>
最新推荐更多>>>
- 发表评论
-
- 最新评论 更多>>