触发器示例 2

 

接(一)

-- 触发器示例 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

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页