当前位置: 代码迷 >> SQL >> SQL Server2005触发器模拟ATM机存取款的功能
  详细解决方案

SQL Server2005触发器模拟ATM机存取款的功能

热度:110   发布时间:2016-05-05 14:43:18.0
SQL Server2005触发器模拟ATM机存取钱的功能
根据上面的简单介绍,我们举一个例子。
以下是一个银行系统的二张表:
银行卡信息表(卡号、银行名称、帐户名、密码、余额)
交易信息表(交易号、卡号、交易日期、交易类型、金额),交易类型分“存入”、“支取”和“转账“

创建一个触发器,该触发器可以根据交易信息表内容的变化而修改银行卡的余额信息

表信息如下:
create table cardInfo(CardID char(10) primary key,BankName varchar(20) not null,UserName varchar(20) not null,password varchar(20) not null,Balance money not null)create table tradeInfo(TradeID int identity(1,1) primary key,CardID char(10) references cardinfo(cardid),TradeDate DateTime  not null,TradeMoney Money,TradeType char(10) )--identity(1,1)--代表主键自增长--参数1,代表主键的初始值--参数2,代表每次在原来基础增加多少


插入数据如下:
insert into cardinfo values('123456','中国银行','哈密瓜','123456',100000)


有了以上的数据,我们开始设计一个存储过程来完成存钱、取钱、转账的操作

思路如下:
--交易信息类型
--1、存钱 2、取钱 3、转账
--TradeType

--存钱操作:insert --> 对银行卡的操作:update
--取钱操作:insert --> 对银行卡的操作:update
--转账操作:insert --> 对银行卡的操作:update已经存在的另一个卡更新
--生成一个交易流水号

存储过程代码:

create procedure trade_proc@v_cardid char(10),@v_trademoney money,@v_tradetype char(10)asdeclare @a varchar(10)set @a = rtrim(@v_cardid)if not exists (select cardid from cardInfo where cardid = @a)beginprint '你输入的卡号不存在,请重新输入'endelsebegininsert into tradeinfo (cardId,tradedate,trademoney,tradetype)values (@a,getdate(),@v_trademoney,@v_tradetype)end


触发器代码如下:

create trigger tradeinfo_trigger on tradeinfofor insertasbegindeclare @v_tradetype char(10) --获取交易类型declare @v_trademoney money --获取交易的moneydeclare @v_cardid char(10) --银行卡的iddeclare @v_Balance money --余额set @v_tradetype=(select tradetype from inserted)set @v_trademoney=(select trademoney from inserted)set @v_cardid=(select cardid from inserted)set @v_Balance=(select Balance from cardinfo where cardid = @v_cardid)if @v_tradetype = '取钱' and @v_trademoney <= @v_Balancebeginupdate cardinfo set [email protected][email protected]_trademoney where [email protected]_cardidendelse if @v_tradetype = '存钱'beginupdate cardinfo set [email protected][email protected]_trademoney where [email protected]_cardidendelse beginrollback transaction --如果操作失败(所有存钱、取钱过程终止,且数据不进行数据库中)endend


执行存储过程:exec trade_proc '123456',1000,'存钱'

执行结果:
123456            中国银行        哈密瓜          123456        101000.00

4        123456            2011-03-30 15:45:24.547        1000.00        存钱 
  相关解决方案