--创建触发器,示例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
/* 针对[卷烟库存表],插入测试数据: 注意,第一条数据(红塔山新势力)中的数据符合业务规则, 第二条数据(红塔山人为峰)中,[库存金额]空,不符合业务规则, 第三条数据(云南映像)中,[库存金额]不等于[库存数量]乘以[库存单价],不符合业务规则。 第四条数据库存数量为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
--查询数据
SELECT * FROM 卷烟库存表 GO /*
结果集
RecordId 卷烟品牌 库存数量 库存单价 库存金额 -------- ------------ -------- ------- --------- 1 红塔山新势力 100 12.0000 1200.0000 2 红塔山人为峰 100 22.0000 2200.0000 3 云南映像 100 60.0000 6000.0000 4 玉溪 0 30.0000 .0000
(所影响的行数为 4 行)
*/
--触发器示例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
|