zoukankan      html  css  js  c++  java
  • 触发器2

    Sql Server 触发器(二)
    2009-04-15 09:59

    接(一)

    --触发器示例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

    --对合法的数据进行处理

    --强制执行下列语句,保证业务规则

    UPDATE 卷烟销售表

    SET 销售金额 = 销售数量 * 销售单价

    WHERE 卷烟品牌 IN (SELECT 卷烟品牌 FROM INSERTED)

    DECLARE @卷烟品牌 VARCHAR(40)

    SET @卷烟品牌 = (SELECT 卷烟品牌 FROM INSERTED)

    DECLARE @销售数量 MONEY

    SET @销售数量 = (SELECT 销售数量 FROM INSERTED)

    UPDATE 卷烟库存表

    SET 库存数量 = 库存数量 - @销售数量,

    库存金额 = (库存数量 - @销售数量)*库存单价

    WHERE 卷烟品牌 = @卷烟品牌

    COMMIT TRANSACTION

    GO

    --请大家自行跟踪[卷烟库存表][卷烟销售表]的数据变化。

    --针对[卷烟销售表],插入第一条测试数据,该数据是正常的。

    INSERT INTO 卷烟销售表(卷烟品牌,购货商,销售数量,销售单价,销售金额)

    SELECT ’红塔山新势力’,’某购货商’,10,12,1200

    GO

    --针对[卷烟销售表],插入第二条测试数据,该数据 销售金额 不等于 销售单价 * 销售数量。

    --触发器将自动更正数据,使 销售金额 等于 销售单价 * 销售数量。

    INSERT INTO 卷烟销售表(卷烟品牌,购货商,销售数量,销售单价,销售金额)

    SELECT ’红塔山人为峰’,’某购货商’,10,22,2000

    GO

  • 相关阅读:
    025、MySQL字符串大小写转化函数,文本转化大写,文本转化小写
    024、MySQL字符串替换函数,文本替换函数
    023、MySQL取文本长度取字符串长度
    022、MySQL字符串的拼接
    021、MySQL变量的使用,在MySQL中创建存储过程,并添加变量
    020、MySQL创建一个存储过程,显示存储过程,调用存储过程,删除存储过程
    019、MySQL取本季度开始时间和本季度结束时间
    018、MySQL取满足日期在两个日期之间的所有数据
    017、MySQL取第4本季度开始和结束日期
    016、MySQL取本年第一季度开始日期
  • 原文地址:https://www.cnblogs.com/xianqingzh/p/1447145.html
Copyright © 2011-2022 走看看