`
caleb_520
  • 浏览: 247826 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

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

SQL 
阅读更多
根据上面的简单介绍,我们举一个例子。
以下是一个银行系统的二张表:
银行卡信息表(卡号、银行名称、帐户名、密码、余额)
交易信息表(交易号、卡号、交易日期、交易类型、金额),交易类型分“存入”、“支取”和“转账“

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

表信息如下:
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)
as
declare @a varchar(10)
set @a = rtrim(@v_cardid)
if not exists (select cardid from cardInfo where cardid = @a)
begin
print '你输入的卡号不存在,请重新输入'
end
else
begin
insert into tradeinfo (cardId,tradedate,trademoney,tradetype)
values (@a,getdate(),@v_trademoney,@v_tradetype)
end


触发器代码如下:

create trigger tradeinfo_trigger on tradeinfo
for insert
as
begin
declare @v_tradetype char(10) --获取交易类型
declare @v_trademoney money --获取交易的money
declare @v_cardid char(10) --银行卡的id
declare @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_Balance
begin
update cardinfo set Balance=@v_Balance-@v_trademoney where cardid=@v_cardid
end
else if @v_tradetype = '存钱'
begin
update cardinfo set Balance=@v_Balance+@v_trademoney where cardid=@v_cardid
end
else 
begin
rollback transaction --如果操作失败(所有存钱、取钱过程终止,且数据不进行数据库中)
end
end


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

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

4        123456            2011-03-30 15:45:24.547        1000.00        存钱 
0
0
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics