触发器练习二

创建触发器[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

原文地址:https://www.cnblogs.com/cuig/p/7874170.html