《ATM提款机数据库实训(共26页).doc》由会员分享,可在线阅读,更多相关《ATM提款机数据库实训(共26页).doc(26页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、精选优质文档-倾情为你奉上长 沙 学 院课程设计说明书题目ATM系统系(部)计算机科学与技术系专业(班级)软件五班姓名学号指导教师起止日期2013.6.132013.06.22实训任务书课程名称:服务外包软件综合实训设计题目:ATM系统已知技术参数和设计要求:1 实训目的要求通过本实训,应能够对SQLServer20005工具的了解,与数据库语法的能力。1)了解SQL的简史和功能特性。2)掌握E-R图的绘制和数据库的设计。3)掌握T-SQL的语法知识,并能够熟练运用它。 4)掌握事务与存储过程的使用。2 问题描述(功能要求):本次案例将完成一个ATM银行取款机系统的数据库。(1) 创建Bank
2、DB数据库。并保存在D:ATM文件夹下。 (2) 创建用户信息表(userinfo) (3) 创建银行卡信息表(cardinfo) (4) 创建交易信息表(transinfo) (5) 添加各种约束关系: 为userinfo表中客户ID(customerID)添加主键约束。 为userinfo表中客户的身份证(PID)添加唯一约束 为useinfo表中的身份证号码添加检查约束,长度为15或者18 为userinfo表中的客户电话号码添加检查约束。 为cardinfo表中的卡号ID(cardID)添加主键约束 为cardinfo表中的卡号ID(cardID)添加约束,必须是以 1010 3576
3、开头,长度为12 为cardinfo表中的货币类型(curType)添加默认约束,默认为RMB。 为cardinfo表中的存款类型添加约束,只能是活期、定活两便和定期。 cardinfo表中开卡日期默认为当天日期。 cardinfo表中的开户金额不能低于1元。 cardinfo表中的余额不能低于1元。 cardinfo表中的密码长度为6位数。默认为88888。 cardinfo表中是否挂失只能是是和否。默认为否 添加userinfo表与cardinfo表的外键约束。 transinfo表中的交易日期默认为当天。 交易类型只能是存入和支取。 添加cardinfo表与transinfo表的外键约束
4、。(6)开户(7)取钱(8)存钱(9)查询余额(10)转账(11)交易统计3. 运行环境要求:(1)客户端:windows操作系统,SQL Server 2005 数据库客户端(2)服务器:SQL Server 2005 数据库服务器、4. 技术要求:1)掌握E-R图的绘制和数据库的设计。2)掌握T-SQL的语法知识,并能够熟练运用它。 3)掌握事务与存储过程的使用。 4) 触发器(选做)设计工作量:40课时工作计划:(1) 2011级软件工程所有班级20课时: 设计,计算机系机房/普通教室。16课时:上机、调试。计算机系机房4课时:答辩。计算机系机房。班级日期节次地点内容指导老师11软件5班
5、15周周四9-12节致远楼1201布置任务、上机调试曾俊勇15周周五9-12节致远楼1201上机调试15周周六9-12节致远楼1201上机调试16周周一9-12节致远楼1401上机调试16周周二9-12节致远楼1401上机调试16周周三9-12节致远楼1401上机调试16周周四9-12节致远楼1201上机调试16周周五9-12节致远楼1201上机调试16周周六5-8节致远楼1404上机调试16周周六9-12节致远楼1201答辩指导教师签名:日期:教研室主任签名: 日期:系主任签名: 日期:长沙学院课程设计鉴定表姓名学号专业软件工程班级软件五班设计题目ATM自动取款机系统指导教师指导教师意见:
6、评定等级: 教师签名: 日期: 答辩小组意见:评定等级:答辩小组长签名:日期:教研室意见:教研室主任签名: 日期: 系(部)意见:系主任签名:日期:说明课程设计成绩分“优秀”、“良好”、“及格”、“不及格”四类;目 录一、引言61.1编写目的61.2参考资料6二、需求规约72.1 业务描述72.2 需求分析7三、数据库环境说明8四、数据库的命名规则84.1 数据库对象命名规则84.2 数据项编码规则8五、逻辑设计95.1 E-R图95.2 关系模型9六、物理设计106.1表汇总106.2表1: userinfo表( 用户信息表)106.3表2: cardinfo表( 银行卡信息表)116.4表
7、3: transinfo表(供应表)126.5 存储过程的设计136.6 触发器的设计18七、操作结果207.1 存款测试结果207.2 取款测试结果207.3 转账测试结果217.4 注销结果测试21八、事物设计238.1 事物的创建23总结25一、引言1.1编写目的通过数据库ATM实训,进一步掌握数据库系统的理论和方法。培养和锻炼开发管理信息系统的能力。为今后信息系统开发打下良好的基础。本文档是ATM系统设计文档的组成部分,数据库是一门应用性很强的专业课,在学习时必须注意理论与实践相结合。本次课程环节旨在培养学生在本课程范围内,初步掌握解决实际应用问题时所应具备的查阅资料、综合运用所学知识
8、的能力,为毕业设计及今后从事专业工作打下基础。本课程环节要求学生了解企业管理信息系统后台数据库的设计、配置过程,掌握管理信息系统的开发方法。主要包括:需求分析、数据分析、系统逻辑模型设计方法;功能设计、物理模型设计方法;系统的实现等方法。完成一个小型系统后台数据库的设计与配置。目的是:明确数据库的表名、字段名等数据信息,用来指导后期的数据库脚本的开发,设计该数据库的目的是设计一个ATM系统,能够按照一定条件查询、统计交易信息,可以模拟完成开户、存款、取款、转账、注销、挂失、激活、修改密码、查询等业务。1.2参考资料资料名称作者文件编号、版本数据库系统概论王珊、萨师煊2006年5月第4版数据库设
9、计入门经典鲍威尔2007年3月第1版数据库原理克罗恩科2005年6月第1版二、 需求规约2.1 业务描述ATM系统业务是模拟了银行ATM提款机业务的管理功能。在计算机网络,数据库和先进的开发平台上,利用数据库sql语言模拟开发一个良好的ATM系统,实现顾客的开户、存款、取款、查询、转账、修改密码等一系列操作。并且在完成一定的操作后保存数据的更新和查询。在转账和取款时还要核对余额是否足够,在足够的条件下才能执行。存储内容则是存储用户的一些信息,如电话号码和身份证号码等,一些用户的详细资料,还有卡号表中的金额的信息,并对这些信息能够及时更新。2.2 需求分析开户功能: 新客户需要开户之后才能拥有相
10、应的卡,并对其进行各种交易。在存入一定金额后可以登录或跳转到交易的界面,进行各种交易。存款功能:客户要能够正确地存款,能够准确地更新客户账号中的余额,并且记录客户的操作。l取款功能:判断客户的余额是否大于取款金额,避免出现溢出现象,操作结果记录在表中。转账功能:准确核对客户的账户信息,核对转入账号的信息,判断转出账号的余额是否大于转出金额,避免出现溢出现象,并记录转出账号和转入账号的操作。注销功能: 老用户可在此注销自己原有的卡。挂失功能: 当客户遗失自己卡后,需对卡进行挂失操作,否则该卡的余额取不出。激活功能: 客户遗失自己卡并找到卡后,可对卡进行激活操作,以便继续使用该卡。修改密码功能:
11、客户可在此功能下修改卡的原始密码。查询功能:查询客户余额;查询客户的账号信息;查询客户的操作记录;三、 数据库环境说明数据库实例数据库系统数据库部署环境数据库设计工具数据库存放位置说明ATM自动取款机系统Sql Server 2008Windows 2007Sql Server存放位置,绝对路径/相对路径用于ATM自动取款四、 数据库的命名规则4.1 数据库对象命名规则数据库对象命名规则备注表字符串功能描述字符串例如:Client客户信息表视图_View功能描述字符串例如:all_view每个客户订单数视图触发器_trigger功能描述字符串例如:Decre_trigger减少库存触发器存储过
12、程proce_ 功能描述字符串例如:proce_SearchClient查询客户 信息存储过程 4.2 数据项编码规则数据项命名规则数据类型长度范围备注编号类整数序号整型0-65535无姓名类字符串Varchar(20)0-20位无地址类字符串Varchar(20)0-20位无电话类字符串Char(11)11位无价格类浮点型float无无时间类Datetime型Datetime无2011-01-01 10:10:10五、 逻辑设计5.1 E-R图用户信息表户名顾客编号顾客编号PID联系电话居住地址银行卡信息表表卡号密码货币类型是否挂失余额顾客编号开户金额开户日期属于交易信息表属于交易日期交易金
13、额交易类型卡号备注1NMN交易号5.2 关系模型注:下划线为主码,下划波浪线为外码用户(顾客编号,开户名,身份证号码,联系电话,居住地址)银行卡(卡号,顾客编号,密码,开户金额,开户日期,是否挂失,余额,存款类型,货币类型)交易(交易号,卡号,交易金额,交易日期,交易类型,备注)六、 物理设计6.1表汇总表名功能说明表userinfo用户信息表,存储用户信息等表cardinfo银行卡信息表,存储银行卡信息等表transinfo交易信息表,存储客户的交易信息信息等6.2表1: userinfo表( 用户信息表)表名用户信息表(userinfo)数据库用户sa主键customer_ID其他排序字段
14、无索引字段无序号字段名称数据类型(精度范围)允许为空Y/N唯一Y/N区别度默认值约束条件/说明1customer_IDintNY无无identity(1,1)主键/客户编号2customer_namechar(10)NN无无客户姓名3P_IDvarchar(18)NY无无check(len(P_ID)=15 or len(P_ID)=18)身份证号码4customer_phonevarchar(11)YN无无check(customer_phone like 0-90-90-90-90-90-90-90-90-90-90-9 )联系电话5customer_addressvarchar(50)
15、YN无无居住地址sql脚本create table userinfo( customer_ID int identity(1,1) primary key,-顾客编号 customer_name char(10) not null,-开户名 P_ID varchar(18) unique check(len(P_ID)=15 or len(P_ID)=18) not null,-身份证号码 customer_phone varchar(11) check(customer_phone like 0-90-90-90-90-90-90-90-90-90-90-9 ),-联系电话 customer
16、_address varchar(50) -居住地址 );6.3表2: cardinfo表( 银行卡信息表)表名银行卡信息表(cardinfo)数据库用户sa主键card_ID其他排序字段无索引字段无序号字段名称数据类型(精度范围)允许为空Y/N唯一Y/N区别度默认值约束条件/说明1card_IDchar(19) NY无无check(card_ID like 1010 3576 0-90-90-90-9 0-90-90-90-9)主键/卡号2customer_ID int NY无无外键/顾客编号3card_passwordchar(6)NN无无default check(len(card_pa
17、ssword)=6)密码4open_moneymoneyNN无无check(open_money=1)开户金额5open_datedatetimeNN无无default getdate() 开户日期6isreportlosschar(2)YN无无default 否 check(isreportloss=是 or isreportloss=否)挂失状态7balancemoneyNN无无check(balance=1)余额8saving_typevarchar(10)NN无无check(saving_type like 活期 or saving_type like 定活两便 or saving_t
18、ype like定期)存款类型9cur_typechar(5)NN无无default RMB /货币类型sql脚本create table cardinfo( card_ID char(19) check(card_ID like 1010 3576 0-90-90-90-9 0-90-90-90-9) primary key,-卡号 customer_ID int,-顾客编号 card_password char(6) not null default check(len(card_password)=6),-卡密码 open_money money not null check(open_
19、money=1),-开户金额 open_date datetime default getdate() not null, -开户日期 isreportloss char(2) default 否 check(isreportloss=是 or isreportloss=否), -是否挂失 balance money not null check(balance=1), -余额 saving_type varchar(10) not null check(saving_type like 活期 or saving_type like 定活两便 or saving_type like定期),-存
20、款类型 cur_type char(5) not null default RMB ,-货币类型 foreign key (customer_ID) references userinfo(customer_ID) on delete cascade on update cascade);6.4表3: transinfo表(供应表)表名交易信息表(transinfo)数据库用户sa主键trans_ID其他排序字段无索引字段无序号字段名称数据类型(精度范围)允许为空Y/N唯一Y/N区别度默认值约束条件/说明1trans_IDintNY无无identity(1,1)主键/交易号2card_IDch
21、ar(19)NY无无check(card_ID like 1010 3576 0-90-90-90-9 0-90-90-90-9)外键/卡号3trans_moneymoneyNN无无check(trans_money0)/交易金额4trans_datedetetimeNN无无defaultgetdate()交易日期5trans_typevarchar(5)NN无无check(trans_type like 存入 or trans_type like 支取)交易类型6remarkvarchar(50)YN无无备注sql脚本create table transinfo( trans_ID int
22、identity(1,1) primary key,-交易号 card_ID char(19) not null check(card_ID like 1010 3576 0-90-90-90-9 0-90-90-90-9) ,-卡号 trans_money money not null check(trans_money0),-交易金额 trans_date datetime not null defaultgetdate(),-交易日期 trans_type varchar(5) check(trans_type like 存入 or trans_type like 支取),-交易类型 r
23、emark varchar(50), -备注 foreign key (card_ID) references cardinfo(card_ID) on delete cascade on update cascade)6.5 存储过程的设计1、开户存储过程-提示:银行卡卡号共19位(4位数一组,中间用空格隔开),对于某个银行来说,前面8个数字是固定的,后面8个数字-要求随机的,并且唯一。我们只需要产生8位随机的数字,然后和前8位固定的数字“”连接即可。随机函数的用法下:-RAND(随机种子):将产生01的随机数,要求每次的随机种子不一样。为了保证随机种子每次不相同,一般的算法如下:-随机种子
24、=当前的月份数 + 当前秒数1000 +当前毫秒数-产生了01的随机数后,我们取小数点后8位,即:0.xxxxxxxx-使用substring(字符串,开始位置,长度)create procedure proc_CardID2 randCardID char(19) output, -输出参数-银行卡号 card_password char(6), -账号密码 open_money money, -开户金额 isreportloss char(2), -是否挂失 saving_type varchar(10), -存款类型 cur_type char(5), -货币类型 customer_na
25、me char(10), -用户姓名 P_ID varchar(18) -身份证号AS declare r numeric(15,8) -15位数,保留8位小数declare tempStr char(10)select r=rand(datepart(mm,getdate()*)+ (datepart(ss,getdate()*1000)+datepart(ms,getdate() set tempStr=rset randCardID=1010 3576 +substring(tempStr,3,4)+ +substring(tempStr,7,4) -若存在该客户信息 declare c
26、ustomer_ID int if EXISTS(select * from userinfo where P_ID=P_ID) begin - 禁用CHECK约束 alter table cardinfo nocheck constraint ALL; select customer_ID=customer_ID from userinfo where(P_ID=P_ID ) insert into cardinfo(card_ID,customer_ID,card_password,open_money, open_date,isreportloss,balance,saving_type
27、,cur_type) values(randCardID,customer_ID,card_password,open_money, getdate(),isreportloss,open_money,saving_type,cur_type) - 启用CHECK约束 alter table cardinfo check constraint ALL; end else begin print需注册用户信息!请先登记您的详细信息. end-执行存储过程:declare randCardID char(19)exec proc_CardID2 randCardID output,109,否,活期
28、,RMB,曲先生,print 您的卡号为:+randCardID2、存钱存储过程在存储过程中定义三个变量,card_ID char(19), inputmoney money和card_password char(6),这三个变量是用来核对账号的。card_ID char(19)用来核对卡号是否正确,inputmoney money暂时存储需要存入的金额,card_password char(6)则是用来核对密码的。存储过程中对所有需要核对的信息都进行了准确的核对,例如核对账号是否处于挂失状态,核对账号密码是否正确。在核对完所有的信息之后才准确地完成操作。存钱存储过程如下:create pro
29、cedure proc_inputMoney card_ID char(19), inputmoney money , card_password char(6) as declare errorsum int set errorsum=0 declare isreportloss char(2) select isreportloss=isreportloss from cardinfo where card_ID=card_ID and card_password=card_password if(isreportloss=是) begin print 交易正在进行中. print 帐户处
30、于挂失状态则不可以存款 end else if (cast(inputmoney as int)%1000) begin print 交易正在进行中. print 存款金额为100的整数倍 end else if(inputmoney10000) begin print 交易正在进行中. print 存款金额不能大于10000 end else begin begin transaction update cardinfo set balance=balance+inputmoney where card_ID=card_ID and card_password=card_password i
31、nsert transinfo(card_ID,trans_money,trans_date,trans_type,remark) values (card_ID,inputmoney ,getdate(),存入,无) declare money money select money=balance from cardinfo where card_ID=card_ID and card_password=card_password print 交易正在进行中. print 卡号:+card_ID+ 余额+convert(char(19),money) print 交易成功 if(error0
32、) begin rollback transaction end commit transaction end-执行存储过程:exec proc_inputMoney 1010 3576 1111 1111,500,3、取钱存储过程在存储过程中定义三个变量,card_ID char(19), takemoney money和card_password char(6),这三个变量是用来核对账号的。card_ID char(19)用来核对卡号是否正确,takemoney money暂时存储需要取出的金额,并且用该变量存储的值与数据库中的值进行比较,如果变量中的值大于数据库中存储的余额的,则不进行取
33、款操作,card_password char(6)则是用来核对密码的。存储过程中对所有需要核对的信息都进行了准确的核对,例如核对账号是否处于挂失状态,核对账号密码是否正确。在核对完所有的信息之后才准确地完成操作。取钱存储过程如下:create proc proc_takeMoney card_ID char(19),-卡号 takemoney money,-取款金额 card_password char(6) -密码as declare errorsum int -错误基数 set errorsum=0begin transaction -开始取款 if not EXISTS( select
34、card_ID from cardinfo where card_ID=card_ID and card_password=card_password) begin print 交易正在进行中. print 账号或密码输入不正确,请重输: end else begin if EXISTS(select * from cardinfo where isreportloss=是)-判断卡是否挂失 begin print 交易正在进行中. print 帐户处于挂失状态则不可以取款 end else begin if (cast(takemoney as int)%1000)-判断取款金额是否为100
35、的整数倍 begin print 交易正在进行中. print 取款金额应为100的整数倍 end else begin declare money money select money=balance from cardinfo where card_ID=card_ID and card_password=card_password if(takemoneymoney) -取款金额不能超过卡上余额 begin print 交易正在进行中. print 余额不足 end else begin update cardinfo set balance=balance-takemoney wher
36、e card_ID=card_ID and card_password=card_passwordinsert transinfo(card_ID,trans_money,trans_date,trans_type,remark) values (card_ID,takemoney ,getdate(),支取,无) declare balance money -余额 select balance=balance from cardinfo where card_ID=card_ID and card_password=card_password if(error0)begin rollback
37、 transactionendelse begincommit transactionprint 交易正在进行中.print 卡号:+card_ID + 余额+convert(char(19),balance) print 交易成功 end end end end end -执行存储过程:exec proc_takeMoney 1010 3576 1111 1111,100,4、转账存储过程:在存储过程中定义三个变量,card_ID char(19), card_ID2 char(19)和transmoney money,这三个变量是用来核对账号的。card_ID char(19)用来核对转出卡号是否正确,transmoney money暂时存储需要转出的金额,并且用这个变量中的值与数据库中存储的余额值进行比较,如果这个转出值大于数据库中的余额值,则不能执行操作。card_ID2 char(19)则是用来核对转入账号的。在转账的存储过程中,转入的账号核对是非常重要的。存储过程中对所有需要核对的信息都进行了准确的核对,例如核对账号是否处于挂失状态,核对账号密码是否正确。在核对完所有的信息之后才准确地完成操作。转账存储过程如下:create proc proc_transaccountscard_ID char(19),-卡号card_ID2 char(1