一个练习题,关于一个银行的触发器问题,非常感谢!

windyghronger 2007-10-18 09:40:37
现有以下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
...全文
204 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
windyghronger 2007-10-18
  • 打赏
  • 举报
回复
谢谢,大家
wgzaaa 2007-10-18
  • 打赏
  • 举报
回复
IF ( @cke <0) 用的的未更新的存款额 IF ( @cke2 <0)
windyghronger 2007-10-18
  • 打赏
  • 举报
回复
那么 SELECT @cke=存款额 FROM 储户动态信息表 中@cke取的是最后一个人的存款额,不是你要的
SELECT @cke=存款额 FROM 储户动态信息表 where 账号=@zh --加上条件
我加上这个条件还是不行,samfeng_2003的写法是对的
不知道到底为什么错了
samfeng_2003 2007-10-18
  • 打赏
  • 举报
回复
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
wgzaaa 2007-10-18
  • 打赏
  • 举报
回复
那么 SELECT @cke=存款额 FROM 储户动态信息表 中@cke取的是最后一个人的存款额,不是你要的
SELECT @cke=存款额 FROM 储户动态信息表 where 账号=@zh --加上条件
windyghronger 2007-10-18
  • 打赏
  • 举报
回复
SELECT @cke=存款额 FROM 储户动态信息表--中不用核对账户吗,储户动态信息表是一个人的吗,但你后面又用了 WHERE 账号 in 限定

我的储户动态信息表不是一个人,是很多人在一起的
wgzaaa 2007-10-18
  • 打赏
  • 举报
回复
SELECT @cke=存款额 FROM 储户动态信息表--中不用核对账户吗,储户动态信息表是一个人的吗,但你后面又用了 WHERE 账号 in 限定
chuifengde 2007-10-18
  • 打赏
  • 举报
回复
试试:
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.账号
playwarcraft 2007-10-18
  • 打赏
  • 举报
回复
我覺得還是寫一起,用trancastion包起來比較好,
用觸發器萬一出問題,取了錢沒扣款就爽了

34,587

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧