触发器,出入库操作(单据写入)时自动更新物料的当前库存数字

  • Post author:
  • Post category:其他


—  作者:彭建军

—  日期:2005-06-27

—  页面:Page3

—  概要:触发器的创建、修改、删除以及调用

—  说明:以下示例均在[查询分析器]下进行,可配合图形界面进行测试

–================================================–

/*

建立虚拟测试环境,包含:表[卷烟库存表],表[卷烟销售表]。

请大家注意跟踪这两个表的数据,体会触发器到底执行了什么业务逻辑,对数据有什么影响。

为了能更清晰的表述触发器的作用,表结构存在数据冗余,且不符合第三范式,这里特此说明。

*/

USE Master

GO

IF EXISTS (SELECT NAME FROM SYSOBJECTS WHERE XTYPE = ‘U’ AND NAME = ‘卷烟库存表’)

DROP TABLE 卷烟库存表

GO

IF EXISTS (SELECT NAME FROM SYSOBJECTS WHERE XTYPE = ‘U’ AND NAME = ‘卷烟销售表’)

DROP TABLE 卷烟销售表

GO

–业务规则:销售金额 = 销售数量 * 销售单价 业务规则。

CREATE TABLE 卷烟销售表

(

卷烟品牌        VARCHAR(40) PRIMARY KEY NOT NULL,

购货商          VARCHAR(40) NULL,

销售数量        INT NULL,

销售单价        MONEY NULL,

销售金额        MONEY NULL

)

GO

–业务规则:库存金额 = 库存数量 * 库存单价 业务规则。

CREATE TABLE 卷烟库存表

(

卷烟品牌        VARCHAR(40) PRIMARY KEY NOT NULL,

库存数量        INT NULL,

库存单价        MONEY NULL,

库存金额        MONEY NULL

)

GO

–创建触发器,示例1

/*

创建触发器[T_INSERT_卷烟库存表],这个触发器较简单。

说明:      每当[卷烟库存表]发生 INSERT 动作,则引发该触发器。

触发器功能:    强制执行业务规则,保证插入的数据中,库存金额 = 库存数量 * 库存单价。

注意:      [INSERTED]、[DELETED]为系统表,不可创建、修改、删除,但可以调用。

重要:      这两个系统表的结构同插入数据的表的结构。

*/

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

–强制执行下列语句,保证业务规则

UPDATE 卷烟库存表

SET 库存金额 = 库存数量 * 库存单价

WHERE 卷烟品牌 IN (SELECT 卷烟品牌 from INSERTED)

COMMIT TRANSACTION

GO

/*

针对[卷烟库存表],插入测试数据:

注意,第



版权声明:本文为add8849原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。