现有以下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 

解决方案 »

  1.   

    我覺得還是寫一起,用trancastion包起來比較好,
    用觸發器萬一出問題,取了錢沒扣款就爽了
      

  2.   

    试试:
    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.账号
      

  3.   

    SELECT  @cke=存款额  FROM 储户动态信息表--中不用核对账户吗,储户动态信息表是一个人的吗,但你后面又用了 WHERE 账号 in 限定
      

  4.   

    SELECT  @cke=存款额  FROM 储户动态信息表--中不用核对账户吗,储户动态信息表是一个人的吗,但你后面又用了 WHERE 账号 in 限定我的储户动态信息表不是一个人,是很多人在一起的
      

  5.   

    那么 SELECT  @cke=存款额  FROM 储户动态信息表 中@cke取的是最后一个人的存款额,不是你要的
    SELECT  @cke=存款额  FROM 储户动态信息表 where 账号=@zh --加上条件
      

  6.   

    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
      

  7.   

    那么 SELECT  @cke=存款额  FROM 储户动态信息表 中@cke取的是最后一个人的存款额,不是你要的 
    SELECT  @cke=存款额  FROM 储户动态信息表 where 账号=@zh --加上条件
    我加上这个条件还是不行,samfeng_2003的写法是对的 
    不知道到底为什么错了
      

  8.   

    IF  ( @cke <0) 用的的未更新的存款额 IF  ( @cke2 <0)