一个练习题,关于一个银行的触发器问题,非常感谢!
现有以下2张表,存取款是在银行里的交易情况,储户动态信息表是储户在银行的存款金额,我现在想创建一个触发器,实现当我们在存取款中取钱或存钱时,储户动态信息表中存款金额也要发生相应的改变,当存钱时就加,取钱时就减。当cke<0时透支时,就不给取款,但我的这个触发器没有实现这个功能,在向存取款中操作时,储户动态信息表里出现莫名其妙的数据,请各位大侠帮忙看看!谢谢
create table 存取款
(  金额 money,          --存取金额  
    标志 int,             --存取标志  1为存,0为取
    账号 char(15)  ,         --账号
   )
create table  储户动态信息表  
   (   账号 char(15) primary key,
      存款额  money)       
create TRIGGER ins存取款 ON 存取款
   FOR INSERT  
   AS
DECLARE    @cke money,        --存款额
            @je money,          --存取金额  
            @bz int,             --存取标志
            @cke2 money,        --存款额变化结果
            @zh char(15)        --账号           
   SELECT  @zh=i.账号,@je=i.金额,@bz=i.标志  
   FROM inserted i    
   SELECT  @cke=存款额  FROM 储户动态信息表  
     BEGIN  
       IF  (@bz=1)
         SET @cke2=@cke+@je
       ELSE   
         SET @cke2=@cke-@je
       IF  ( @cke<0)
         BEGIN
           PRINT '对不起,您不能透支!'          
           ROLLBACK
         END  
      UPDATE 储户动态信息表  SET 存款额=@cke2  WHERE 账号 in (select 账号 from inserted)
  END
------解决方案--------------------我覺得還是寫一起,用trancastion包起來比較好,
用觸發器萬一出問題,取了錢沒扣款就爽了
------解决方案--------------------试试:
UPDATE a  SET 存款额=存款额+case when 标志=1 then 金额 else case when 存款额<0 then 0 else -金额  end end from  储户动态信息表 a inner join inserted b on a.账号=b.账号
------解决方案--------------------那么 SELECT  @cke=存款额  FROM 储户动态信息表 中@cke取的是最后一个人的存款额,不是你要的
SELECT  @cke=存款额  FROM 储户动态信息表 where 账号=@zh --加上条件
------解决方案--------------------create table 存取款  
(  金额 money,          --存取金额 
  标志 int,             --存取标志  1为存,0为取  
  账号 char(15)  ,         --账号  
 )  
create table  储户动态信息表 
 (   账号 char(15) primary key,  
    存款额  money)      
GO
CREATE TRIGGER TR_CQ  
  ON 存取款
  INSTEAD OF INSERT
AS
BEGIN
 DECLARE @cke money, --存款额
         @je  money, --存取金额
         @bz  int,   --存取标志
         @cke2 money,--存款额变化结果
         @zh   char(15) --帐号
 SELECT @zh = i.帐号, @je = i.金额, @bz = i.标志
   FROM INSERTED i  
 SELECT @cke = 存款额 FROM 储户动态信息表 WHERE 帐号 = @zh
 BEGIN
   IF (@bz = 1)
     SET @cke2 = @cke + @je
   ELSE
     SET @cke2 = @cke - @je
    IF (@cke2 < 0 )
     BEGIN
         PRINT  '对不起,您不能透支! '         
     END
    ELSE
       BEGIN
           INSERT INTO 存取款  
             SELECT * FROM INSERTED
           UPDATE 储户动态信息表  SET 存款额=@cke2  WHERE 账号 = @zh
       END  
  END  
END
GO