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