设为首页 加入收藏

TOP

SQL触发器实例讲解2
2014-11-23 22:08:57 来源: 作者: 【 】 浏览:5
Tags:SQL 触发器 实例 讲解

接(一) 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 server 2008之触发器 下一篇SQL Server 使用触发器监控数据变..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: