触发器练习二
创建触发器[T_INSERT_卷烟库存表],这个触发器较简单。
说明: 每当[卷烟库存表]发生 INSERT 动作,则引发该触发器。
触发器功能: 强制执行业务规则,保证插入的数据中,库存金额 = 库存数量 * 库存单价。
注意: [INSERTED]、[DELETED]为系统表,不可创建、修改、删除,但可以调用。
重要: 这两个系统表的结构同插入数据的表的结构。
一、创建卷烟销售表和卷烟库存表
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
创建触发器
CREATE TRIGGER T_INSERT_卷烟库存表
ON 卷烟库存表
FOR INSERT
AS
--提交事务处理
BEGIN TRANSACTION
--强制执行下列语句,保证业务规则
UPDATE 卷烟库存表
SET 库存金额 = 库存数量 * 库存单价
WHERE 卷烟品牌 IN (SELECT 卷烟品牌 from INSERTED)
COMMIT TRANSACTION
GO
二、创建触发器[T_INSERT_卷烟销售表],该触发器较复杂。
说明: 每当[卷烟库存表]发生 INSERT 动作,则引发该触发器。
触发器功能: 实现业务规则。
业务规则: 如果销售的卷烟品牌不存在库存或者库存为零,则返回错误。
否则则自动减少[卷烟库存表]中对应品牌卷烟的库存数量和库存金额。
CREATE TRIGGER [dbo].[T_INSERT_卷烟销售表] ON [dbo].[卷烟销售表]
AFTER INSERT
AS
BEGIN TRANSACTION;
--首先判断销售的香烟品牌在库存表里
IF EXISTS (
SELECT 卷烟品牌 FROM dbo.卷烟销售表 WHERE 卷烟品牌
NOT IN (
SELECT 卷烟品牌 FROM dbo.卷烟库存表 )
)
BEGIN
RAISERROR('N该烟卷不存在库存,不能销售',16,1); --raiserror函数应用提示错误信息
ROLLBACK;
RETURN;
END;
--判断库存数量小于0提示错误
IF EXISTS (
SELECT a.库存数量 FROM dbo.卷烟库存表 a , dbo.卷烟销售表 b WHERE a.卷烟品牌 = b.卷烟品牌 AND a.库存数量 <= 0 )
BEGIN
RAISERROR('N该烟卷库存数量小于或等于0,不能销售',16,1);
ROLLBACK;
RETURN;
END;
--对合法数据进行处理 --强制执行下列语句,保证业务规则
UPDATE 卷烟销售表 SET 销售金额 = 销售数量 * 销售单价;
DECLARE @销售数量 INT;
DECLARE @卷烟品牌 NVARCHAR(50);
SET @卷烟品牌 = ( SELECT 卷烟品牌 FROM Inserted );
SET @销售数量 = ( SELECT 销售数量 FROM Inserted );
UPDATE dbo.卷烟库存表 SET 库存数量 = 库存数量 - @销售数量 , 库存金额 = ( 库存数量 - @销售数量 ) * 库存单价
WHERE 卷烟品牌 = @卷烟品牌;
COMMIT TRANSACTION;
GO