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