• 触发器练习二


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

  • 相关阅读:
    识别浏览器信息,判断是否安卓或者苹果手机
    thinkphp5.0 配置文件加载路径说明
    thinkphp5.0 url跳转
    微信小程序--picker
    JavaScript和php数组的定义
    地点下来框的实现(php)
    微信小程序入门(持续更新)
    Vue 拖拽组件 vuedraggable 和 vue-dragging
    递归
    js 为什么有些在原始数据上进行修改,有些进行浅拷贝或深拷贝呢
  • 原文地址:https://www.cnblogs.com/cuig/p/7874170.html
Copyright © 2020-2023  润新知