数据库ATM系统实训报告

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

目录
一、引言 (2)
1.1编写目的 (2)
1.2参考资料 (2)
二、需求规约 (3)
2.1业务描述 (3)
2.2需求分析 (3)
三、数据库环境说明 (5)
四、逻辑设计 (6)
五、物理设计 (7)
5.2数据库表物理设计 (7)
表[1]:交易信息表 (7)
表[2]:用户信息表 (8)
表[3]:银行卡信息表 (9)
5.3视图的设计 (10)
5.4存储过程及触发器的设计 (10)
六、安全性设计 (18)
6.1 防止用户直接操作数据库的方法设计 (18)
七、数据库设计的测试说明 (19)
7.1测试用例 (19)
7.2设计结论 (24)
八、实训总结 (25)
一、引言
1.1 编写目的
本文档ATM自动取款机系统设计文档的组成部分,编写数据库设计文档的目的是:明确数据库的表名、字段名等数据信息,使开发人员能据此开发该系统。

1.2 参考资料
二、需求规约
2.1 业务描述
某银行拟开发一套ATM取款机系统,实现如下功能:
1、开户(到银行填写开户申请单,卡号自动生成)
2、获取密码(给出卡号,获取相应密码)
3 解除挂失(给出卡号,解除挂失)
4、修改密码(给出卡号,将旧密码修改为新密码)
5、挂失(给出卡号,登记挂失信息)
6、催款提醒(帐号余额小于等于某个值(比如100)时返回客户的姓名及联系电话(业务员可以催
款提醒用户)。

7、周交易(查询某卡前一周的交易信息)
8、查询最高消费(查询消费最高的卡号)
9、查询挂失卡号(查看所有挂失的卡号)
10、统计余额盈利(统计银行的资金流通余额和盈利结算。

计算公式为:资金流通余额=总存入量-
总支取量盈利结算=总支取量*0.008-总存入量*0.003)
11、存款取款存取过程(实现存款取款功能。

取款要求输入密码)
12、转账交易存储过程(某卡上的款转帐到另一卡上。

要求事务处理
2.2 需求分析
根据银行方面取得的信息资料,得出系统的信息需求和处理要求,得到设计所需的需求信息。

这些信息是选择了对数据库设计直接有用的信息。

1、A TM自动取款机系统用例分析:
管理员
存款:客户在ATM机上实现现金的存储开户:管理者对客户要求进行开户处理。

取款:客户在ATM机上实现现金的取款挂失账户:管理根据客户要求对丢失的卡进行挂失
转账:客户在ATM机上实现转入钱的功能解冻账户:管理根据客户要求对找到的卡进行解冻查询:客户在ATM机上实现余额查询的功能修改密码:管理根据客户要求对密码进行修改
2、A TM自动取款机系统的业务逻辑分析:
(1)首先是用户插入银行卡
(2)用户自行输入密码
(3)ATM连接银行的数据库,判断卡号密码是否正确,正确就到操作界面,否则从新输入。

(4)操作界面有取款,存款,转账,密码修改。

(5)完成用户需求后退出卡
三、数据库环境说明

四、逻辑设计
ATM系统需要有用户信息,还要银行卡的信息,还需要交易信息,以供银行人员查询。

(1)用户信息包括记录开户客户的相关信息存储开户客户的客户编号、姓名、身份证号、居住地址和联系电话
(2)交易信息记录银行卡的相关信息存储卡号号、货币类型、存款类型、开户日期、开户金额、余额和顾客编号
(3)银行卡记录交易的相关信息存储交易日期、交易卡号、交易类型、交易金额和备注信息
五、物理设计
5.2 数据库表物理设计表[1]:交易信息表
表[2]:用户信息表
表[3]:银行卡信息表
5.3视图的设计
1、建立一张最高交易信息的视图
目的:查找最高交易。

功能:能够及时展现最高交易。

意义:有利于数据库安全的维护,防止任意修改数据库中的交易信息
---最高交易
create view view_mosttransinfo(cardID,transMoney)
as
select cardID,MAX (transMoney) from transinfo group by cardID; select *from view_mosttransinfo
2、建立一张周交易信息的视图
目的:查找一周内某卡得所有交易。

功能:能够及时展现一周的交易信息。

意义:有利于数据库安全的维护,防止任意修改数据库中的交易信息
--周交易
create view view_transinfo
as
select transDate,cardID,transType,transMoney from transinfo where datediff(ww,'2013-06-10 00:00:00.0000000',getdate())=0;
select *from transinfo;
2、建立一张查询挂失卡号的视图
目的:查找所有挂失了的卡号。

功能:能够及时展现那些卡号挂失了。

意义:有利于数据库安全的维护,防止客户信息泄露
--查询挂失卡号(查看所有挂失的卡号)
create view view_IsReportLoss
as
select cardID,IsReportLoss from cardinfo where IsReportLoss='是'; select *from view_IsReportLoss;
5.4 存储过程及触发器的设计
5.4.1 产生随机卡号存储过程
功能:随机生成卡号
目的:让客户能拿到随机的卡号,能避免重复的卡号出现
意义:用随机卡号能让客户使用到随机的卡号
代码:
create procedure proc_cardinfo-----------创建开户存储过程
(
@savingType char(15),
@openMoney money,
@balance money,
@customerID int
)
as
---*---------------声明固定的数字与随机的数字-------------------*/
declare @tempStr varchar(10)
set @tempStr='1010 3576 '
declare @r numeric(10,8) --后8位随机数
/*----------------------产生随即因子----------------------*/
select @r=rand( (datepart(mm,getdate() )*10000) +(datepart(ss,getdate() )*1000) +datepart(ms,getdate()) )
/*-----截取@r中小数点后的四位随机数,再添加空格,再截取最后四位--*/
declare @cardID char(30)
set @cardID =@tempStr+substring(convert(varchar(10),@r),3,4)+' '+substring(convert(varchar(10),@r),7,8)
INSERTINTOcardInfo(cardID,savingType,openMoney,balance,customerID)VALUES(@cardID,@savingT ype,@openMoney,@balance,@customerID)
5.4.2 解除挂失存储过程
功能:实现银行卡解除挂失功能
目的:银行卡找回或者记起密码银行卡解除挂失
意义:更好地保护客户信息
代码:
create procedure update1_IsReportLoss----------创建解除挂失存储过程
(@customerID varchar(20),
@cardID varchar(20),
@PID char(18)
)
as
declare @IsReportLoss char(8)
begin
if not exists(select *from cardInfo where customerID=@customerID)
print '您输入的顾客编号不存在'
else if(@PID!=(select PID from userinfo where @customerID=customerID))
print'身份证错误,不能解挂。

'
else if((select cardID from cardinfo where @customerID=customerID)!=@cardID)
print'卡号错误,不能解挂。

'
else if((select IsReportLoss from cardinfo where @customerID=customerID)='否')
print'卡号未挂失,不用解挂。

'
else
begin
update cardinfo set IsReportLoss='否' where cardID=@cardID;
end
end
5.4.3 获取密码存储过程
功能:获取密码
目的:能使客户获取密码
意义:是有效地保护密码不被盗取
代码:
create procedure get_pass----------创建获取密码存储过程
(
@cardID varchar(20)
)
as
declare @pass char(6)
begin
if not exists(select * from cardinfo where cardID=@cardID)
print'该卡号不存在'
else
begin
select @pass=pass from cardinfo where @cardID=cardID
print '卡号:'+convert(varchar(30),@cardID) +'密
码:'+convert(varchar(15),@pass)
end
end
5.4.4 修改密码存储过程
功能:修改密码
目的:使客户能使用旧密码修改新密码
意义:更加人性化地修改密码
代码:
create procedure update_pass----------创建修改密码存储过程
(
@cardID varchar(20),
@1pass varchar(6),
@2pass varchar(6)
)
as
if not exists(select *from cardInfo where cardId=@cardId)
print '您输入的账号不存在'
else if(@1pass!=(select pass from cardInfo where cardID=@cardID)) print '原密码输入错误。

'
else
begin
print '输入新密码。

'
update cardinfo set pass=@2pass where cardID=@cardID;
5.4.5 挂失存储过程
功能:实现银行卡挂失功能
目的:银行卡丢失或密码忘记使银行卡挂失
意义:更好地保护客户信息
代码:
create procedure update_IsReportLoss----------创建挂失存储过程
(@customerID varchar(20),
@cardID varchar(20),
@PID char(18)
)
as
declare @IsReportLoss char(8)
begin
if not exists(select *from cardInfo where customerID=@customerID)
print '您输入的顾客编号不存在'
else if(@PID!=(select PID from userinfo where @customerID=customerID))
print'身份证错误,不能挂失。

'
else if((select cardID from cardinfo where @customerID=customerID)!=@cardID) print'卡号错误,不能挂失。

'
else if((select IsReportLoss from cardinfo where @customerID=customerID)='是')
print'卡号已挂失,不用挂失。

'
else
begin
update cardinfo set IsReportLoss='是' where cardID=@cardID;
end
end
5.4.6 催款提醒存储过程
功能:催款提醒
目的:银行能根据存款信息返回客户信息以提醒客户存款
意义:能有利于银行管理客户银行卡信息
代码:
create procedure pro_ckts----------创建催款提醒存储过程
(
@cardID char(30)
)
as
declare @balance money,@telephone char(15), @customerID int
begin
if((select balance from cardInfo where cardID=@cardID)>100)
print '该帐户不需要提醒'
else
select @balance =balance from cardInfo where cardID=@cardID
select @customerID=customerID from cardinfo where cardID=@cardID
select @telephone =telephone from userinfo where customerID=@customerID
print '业务员提醒该帐户余额不足100元'
print '卡号:'+convert(varchar(30),@cardID)+'余额:'+convert(varchar(20),@balance) +'电话:'+convert(varchar(15),@telephone)
end
end
5.4.7 统计银行的资金流通余额和盈利结算
功能:计算银行盈利额
目的:统计银行的资金流通余额和盈利结算
意义:为银行提供盈利信息
代码:
create procedure proc_money ----------创建计算银行盈利额存储过程
as
declare @1money money,@2money money,@t money ,@d money
select @1money = SUM(transMoney) from transinfo where transType ='存入'
select @2money = SUM(transMoney) from transinfo where transType ='支取'
set @t=@1money -@2money
set @d=0.008*@2money -0.003*@1money
print '资金流通余额:'+convert(varchar(20),@t)+'盈利结算:'+convert(varchar(10),@d)
5.4.8 创建存钱和取钱的存储过程
功能:存钱和取钱
目的:进行客户与银行间的交易
意义:能使客户更好地管理自己的金钱
代码:
create procedure proc_takeMoney ----------创建取款存储过程
(
@cardID varchar(20),
@pass varchar(6),
@money Money
)
as
declare @balance money,@IsReportLoss char(8)
begin
if not exists(select *from cardInfo where cardId=@cardId)
print '您输入的账号不存在'
else if((select pass from cardInfo where cardID=@cardID)!=@pass)
print '密码不正确。

'
else if((select IsReportLoss from cardInfo where cardID=@cardID)='是')
print '卡已挂失, 交易不能进行。

'
else if( @balance-@money < 0)
print '交易失败,余额不足。

'
else if(convert(int,@money )%100!=0)
print '本柜员机只提供面值100元的纸币,取款金额为100的整数倍。

'
else if((select balance from cardInfo where cardID=@cardID)-@money <1)
print '取款后余额不能低于1元'
else
begin
update cardInfo set balance = balance - @money where cardID=@cardID
select @balance= balance from cardinfo where cardID=@cardID
insert transInfo(transDate ,cardID,transType,transMoney,remark) values(default,@cardID,'支取',@money ,'') print '交易成功'
print '交易金额:'+convert(varchar(10),@money)
print '卡号:'+convert(varchar(18),@cardID)+' 余额:'+convert(varchar(10),@balance)
end
end
create procedure proc_saveMoney ----------创建存款存储过程
(
@cardID varchar(20),
@pass varchar(6),
@money money
)
as
declare @balance money,@IsReportLoss char(8)
begin
if not exists(select *from cardInfo where cardId=@cardId)
print '您输入的账号不存在'
else if((select pass from cardInfo where cardID=@cardID)!=@pass)
print '密码不正确。

'
else if((select IsReportLoss from cardInfo where cardID=@cardID)='是')
print '卡已挂失, 交易不能进行。

'
else if(convert(int,@money )%100!=0)
print '本柜员机只存入面值100元的纸币,存款金额为100的整数倍。

'
else
begin
update cardInfo set balance =balance + @money where cardID=@cardID
insert transInfo(transDate ,cardID,transType ,transMoney,remark) values(default,@cardID,'存入',@money,'')
select @balance =balance from cardInfo where @cardID=cardID
print '交易成功'
print '交易金额:'+convert(varchar(10),@money)
print '卡号:'+convert(varchar(20),@cardID)+'余额:'+convert(varchar(10),@balance)
end
end
5.4.9 创建转账交易的存储过程
功能:转账交易
目的:将一个卡上的资金转入另一个卡中
意义:提供转账交易避免现金交易,提高资金安全性。

代码:
create procedure zhuanzhang--------创建转账存储过程
@cardID varchar(20),
@cardID1 varchar(20),
@pass int,
@zhuanzhang int
as
begin tran
if exists(select *from cardinfo where cardID =@cardID)
begin
declare @pass1 int
set @pass1=(select pass from cardinfo where cardID=@cardID)
if(@pass1=@pass)
begin
if exists(select *from cardinfo where cardID=@cardID1)
begin
declare @zhuanzhang1 int,@balance money
set @zhuanzhang1=(select balance from cardinfo where cardID=@cardID1)
if(@zhuanzhang<@zhuanzhang1)
begin
insert transInfo(transDate ,cardID,transType,transMoney,remark) values(default,@cardID,'支取',@zhuanzhang ,'')
update cardinfo set balance=balance-@zhuanzhang where cardID=@cardID
insert transInfo(transDate ,cardID,transType ,transMoney,remark)
values(default,@cardID1 ,'存入',@zhuanzhang,'')
update cardinfo set balance=balance+@zhuanzhang where cardID=@cardID1
select @balance =balance from cardInfo where cardID=@cardID
commit;
print'转账成功!'
print '交易金额:'+convert(varchar(10),@zhuanzhang)
print '卡号:'+convert(varchar(20),@cardID)+'余额:'+convert(varchar(10),@balance)
end
else
begin
print'不能转账,余额不足'
rollback tran
end
end
else
begin
print'转账号码不存在' rollback tran
end
end
else
begin
print'密码输入错误' rollback tran
end
end
else
begin
print'卡号不存在'
rollback tran
end
六、安全性设计
6.1 防止用户直接操作数据库的方法设计
首先建一个用户名,设置密码
exec sp_addlogin 'zw','123456','ATM' ---用户名登录,密码为,默认数据库为ATM 在建立一个角色名r1
create role r1;
使用GRANT语句,使角色r1拥有表userinfo表的权限
grant select,update,insert
on table userinfo To r1;
七、数据库设计的测试说明
7.1 测试用例
1.开户功能测试
测试用例编号:ATM-TestCase-1
测试目的:测试ATM储户开户功能
测试输入:
exec proc_cardinfo
@savingType='活期',
@openMoney =1000,
@balance =1000,
@customerID =6
预期输出:
用户编号为:6;开户金额:1000;账号为:1010 3576 0000 0000;存款类型:活期;实际输出:
测试结论:业务需求要求的开户功能达到了设计要求。

2、修改密码功能测试
测试用例编号:ATM-TestCase-2
测试目的:测试ATM储户修改密码功能
测试前提:数据库中存在你输入的卡号,旧密码。

测试输入:
exec update_pass
@cardId ='1010 3576 5524 4986 ',
@1pass='888888',--旧密码
@2pass='123456'--新密码
预期输出:
密码由888888改为123456
实际输出:
测试结论:
业务需求要求的修改密码功能达到了设计要求。

3、获取密码功能测试
测试用例编号:ATM-TestCase-3
测试目的:测试ATM储户获取密码功能
测试前提:数据库中存在你要获取密码的卡号,密码。

测试输入:
exec get_pass
@cardID='1010 3576 5589 5986 '
预期输出:
卡号:1010 3576 5589 5986 密码:123456
实际输出:
测试结论:业务需求要求的获取密码功能达到了设计要求。

4、挂失功能测试
测试用例编号:ATM-TestCase-4
测试目的:测试ATM储户挂失功能
测试前提:数据库中存在卡号,身份证号,客户编号。

测试输入:
exec update_IsReportLoss
@customerID='3',
@PID='145578999524125',
@cardID ='1010 3576 5524 4986'
预期输出:
1010357655244986账号的挂失栏由‘否’改为‘是’实际输出:
测试结论:业务需求要求的挂失功能达到了设计要求。

5、解挂功能测试
测试用例编号:ATM-TestCase-5
测试目的:测试ATM储户解挂功能
测试前提:数据库中存在卡号,身份证号,客户编号。

测试输入:
exec update_IsReportLoss
@customerID='3',
@PID='145578999524125',
@cardID ='1010 3576 5524 4986'
预期输出:
1010357655244986账号的挂失栏由‘是’改为‘否’实际输出:
测试结论:业务需求要求的挂失功能达到了设计要求。

6、催款提醒功能测试
测试用例编号:ATM-TestCase-6
测试目的:测试催款提醒功能
测试前提:数据库中存在卡号,客户编号,客户身份证。

exec pro_ckts
@cardID='1010 3576 5589 5986 '
预期输出:
业务员提醒该账户余额不足100元
实际输出:
测试结论:业务需求要求的催款提醒功能达到了设计要求。

7、周交易功能测试
测试用例编号:ATM-TestCase-7
测试目的:测试ATM储户周交易功能
测试前提:所查询的时间内有交易。

测试输入:
select *from transinfo;
预期输出:
一个或多个账号以及它的交易信息。

实际输出:
测试结论:业务需求要求的查询周交易功能达到了设计要求。

8、查询最高消费功能测试
测试用例编号:ATM-TestCase-8
测试目的:测试查询最高消费功能
测试前提:有消费记录。

测试输入:
select *from view_mosttransinfo
预期输出:
一个或多个账号。

实际输出:
测试结论:业务需求要求的查询最高交易功能达到了设计要求。

9、查询挂失账号功能测试
测试用例编号:ATM-TestCase-9
测试目的:测试查询挂失账号功能
测试前提:有已经挂失的账号。

测试输入:
select *from view_IsReportLoss;
预期输出:
一个或多个账号。

测试结论:业务需求要求的查询挂失账号功能达到了设计要求。

10、统计余额盈利功能测试
测试用例编号:ATM-TestCase-10
测试目的:测试统计余额盈利功能
测试前提:有交易信息。

测试输入:
exec proc_money
@money =1
预期输出:
两个数字。

实际输出:
测试结论:业务需求要求的统计余额盈利功能达到了设计要求。

11、存款取款功能测试
测试用例编号:ATM-TestCase-11
测试目的:测试ATM储户存款取款功能
测试前提: ATM系统中存在账号,密码。

测试输入:
exec proc_takeMoney
@cardID='1010 3576 5589 5986 ',
@pass='888888',
@money='100'
exec proc_saveMoney
@cardID='1010 3576 5589 5986 ',
@pass='888888',
@money ='10000'
预期输出:
存入或取出的账号的余额发生改变
实际输出:
测试结论:业务需求要求的存取款功能达到了设计要求。

12、转账功能测试
测试用例编号:ATM-TestCase-12
测试目的:测试统计余额盈利功能
测试前提:ATM系统中至少存在两个账户,密码。

测试输入:
exec transfer
@incardId ='1010 3576 5524 4986 ',
@outcardID='1010 3576 9197 7300 ',
@pass='888888',
@money ='10'
预期输出:
转出账号余额减少10,转入账号增加10.
实际输出:
测试结论:业务需求要求的转账功能达到了设计要求。

7.2 设计结论
这次实训进行的是ATM的系统设计,从分析到设计,发现自己好多漏洞,有些专业知识没有搞清。

不过最后还是在队员的齐心协力下,完成了数据库。

在设计过程中,老师给了许多建议,设计完了以后还觉得还有很多需要修改的地方,有些设计还是有欠缺的。

比如在转账过程中,我们只验证了账号是否存在,还有余额的比较,而没有对账号信息进一步的比较,比如是否挂失,是否解冻,就进行转账。

这样进行是有漏洞的。

容易被别人钻了控子。

在权限方面,做的还有缺陷,权限没有分配好。

应为在这方面我们还学的不太好,也没学习了多少。

所以存在着很多漏洞。

还有改进的地方。

在这次数据库的设计当中,有许多做的还令自己欣慰的。

比如,在建表的时候,综合设计书,和要求。

我觉得自己的设计的表格还是很合理的。

在存储设计的时候,考虑的要求还是蛮多的,在验证银行卡的时候是符合设计的要求的。

在这次设计中,体会到团队合作的效果,这是最大的收获!
八、实训总结
本次数据库课程设计让我深刻体会到了,书本前后的衔接性,这次课程设计涉及到了书本几乎全部知识点,而在本次课程设计之前,我一直都没搞懂很多知识点,而且运用起来很生疏,尽管刚刚做得时候困难重重,思路非常不明确。

但是经过我请教老师和同学之后,我从学习中逐渐找到了清晰的思路,并把知识点连接了起来,从自己亲自实践之后才能发现,只有自己动手过才能深刻理解书本知识,而不是单独的死记硬背。

在本次课程设计当中,我多次遇到错误,而每次当自己埋头思考和向同学老师请教的过程中,问题总能解决,我在学习当中磨练了自己的独立思考能力和动手能力,这也是我这次课程设计的一个很大的收获。

在本次课程设计中,我明白了许多,在理论学习期间,没有认真的学,以至于在设计期间,许多东西不懂,在完成后,我突然回过头看,突然发现自己设计的数据库有许多漏洞,比如,在这系统中,汽车租赁系统中,租出去了车是还能再租,且没有的车也是能租的,且触发器也没设好,导致了许多漏洞,又是还运行错误,在老师和同学的帮助下,慢慢再次重走设计过程,一步步搞清关系,然后再网上学习,最好定义好表格,规定了数据类型,且字符大小,使系统运行便捷,最后设计存储过程,使之系统更完善,完全ATM的全部过程过程,最后还实现了数据库的权限分配过程。

最后阶段,有同学说,要实现输入信息优化,所以我建立了几个存储过程,为的是信息输入更方便,便捷。

终于完成了课程设计了,心里不免有些兴奋,那毕竟是自己第一次独立完成的,我觉得这设计的生活也是有乐趣的,不过还是挺累的。

相关文档
最新文档