
SQL触发器实例2
/*建立虚拟测试环境，包含：表[卷烟库存表]，
表[卷烟销售表]。 请大家注意跟踪这两个表的数据，
体会触发器到底执行了什么业务逻辑，对数据有什么影响。 
为了能更清晰的表述触发器的作用，表结构存在数据冗余，
且不符合第三范式，这里特此说明。 */




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]为系统表，不可创建、修改、删除，但可以调用。

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



 /*针对[卷烟库存表]，插入测试数据：
 注意，第一条数据（红塔山新势力）中的数据符合业务规则，
       第二条数据（红塔山人为峰）中，[库存金额]空，不符合业务规则，
       第三条数据（云南映像）中，[库存金额]不等于[库存数量]乘以[库存单价]，不符合业务规则。 第四条数据库存数量为0。 

请注意在插入数据后，检查[卷烟库存表]中的数据是否库存金额 =库存数量 *库存单价。

 */ 

INSERT INTO卷烟库存表(卷烟品牌,库存数量,库存单价,库存金额)
SELECT ’红塔山新势力’,100,12,1200 UNION ALL 
SELECT ’红塔山人为峰’,100,22,NULL UNION ALL
SELECT ’云南映像’,100,60,500 UNION ALL 
SELECT ’玉溪’,0,30,0 GO 

--查询数据 


