现在的位置: 首页 > 综合 > 正文

SQL触发器实例讲解学习(2)

2013年10月07日 ⁄ 综合 ⁄ 共 1195字 ⁄ 字号 评论关闭

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

抱歉!评论已关闭.