日期:2014-05-18  浏览次数:20453 次

一个练习题,关于一个银行的触发器问题,非常感谢!
现有以下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