—  作者:彭建军
    
    —  日期:2005-06-27
    
    —  页面:Page3
    
    —  概要:触发器的创建、修改、删除以及调用
    
    —  说明:以下示例均在[查询分析器]下进行,可配合图形界面进行测试
    
    –================================================–
   
    /*
    
    建立虚拟测试环境,包含:表[卷烟库存表],表[卷烟销售表]。
    
    请大家注意跟踪这两个表的数据,体会触发器到底执行了什么业务逻辑,对数据有什么影响。
    
    为了能更清晰的表述触发器的作用,表结构存在数据冗余,且不符合第三范式,这里特此说明。
    
    */
   
    USE Master
    
    GO
   
    IF EXISTS (SELECT NAME FROM SYSOBJECTS WHERE XTYPE = ‘U’ AND NAME = ‘卷烟库存表’)
    
    DROP TABLE 卷烟库存表
    
    GO
    
    IF EXISTS (SELECT NAME FROM SYSOBJECTS WHERE XTYPE = ‘U’ AND NAME = ‘卷烟销售表’)
    
    DROP TABLE 卷烟销售表
    
    GO
   
–业务规则:销售金额 = 销售数量 * 销售单价 业务规则。
    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
   
–创建触发器,示例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
   
    /*
    
    针对[卷烟库存表],插入测试数据:
    
    注意,第
   
 
