银行ATM存取款机系统设计与实现.docx
《银行ATM存取款机系统设计与实现.docx》由会员分享,可在线阅读,更多相关《银行ATM存取款机系统设计与实现.docx(31页珍藏版)》请在冰豆网上搜索。
银行ATM存取款机系统设计与实现
《数据库技术与开发》
项目实训设计报告
项目名称:
《银行ATM存取款机系统设计与实现》
姓名:
范涛
学号:
21
专业:
软件工程12-2
指导教师:
刘立新
完成日期:
2014-11-20
《银行ATM存取款机系统设计与实现》
第1章:
项目背景
1、项目任务
创建数据库、创建表、创建约束
使用触发器和插入测试数据
模拟常规业务、创建视图
使用存储过程实现业务处理
利用事务实现较复杂的数据更新
2、项目技能目标
Ø使用PowerDesigner完成数据库概念模型和数据库物理模型设计。
Ø使用T-SQL语句创建数据库、表和各种约束。
Ø使用T-SQL语句编程实现常见业务。
Ø使用触发器实现多表之间的级联更新。
Ø使用事务和存储过程封装业务逻辑。
Ø使用视图简化复杂的数据查询。
Ø使用游标技术实现结果集的行集操作。
3、需求概述
某银行是一家民办的小型银行企业,现有十多万客户,公司将为该银行开发一套ATM存取款机系统,对银行日常的存取款业务进行计算机管理,以便保证数据的安全性,提高工作效率。
要求根据银行存取款业务需求设计出符合第三范式的数据库结构,使用T-SQL语言创建数据库和表,并添加表约束,进行数据的增删改查,运用逻辑结构语句、事务、视图和存储过程,按照银行的业务需求,实现各项银行日常存款、取款和转账业务。
4、开发环境
Ø数据库:
SQLSERVER2008开发版
Ø数据库建模工具:
PowerDesigner15
第2章:
创建数据库
1.创建数据库
代码如下:
createdatabasebankdb
onprimary
(
name=N'bankdb',
filename=N'G:
\数据库课设\bankdb.mdf',
size=5mb,
maxsize=30mb,
filegrowth=15%
)
logon
(
name=N'bankdb_log',
filename=N'G:
\数据库课设\bankdb_log.ldf',
size=2mb,
maxsize=30mb,
filegrowth=15%
)
2.创建各个数据表及相关的约束
(1).创建银行业务类型表
createtablebankbusinesstype
(
bbt_idintidentity(1,1)primarykey,
bbt_namechar(20)notnull,
bbt_commentvarchar(100)
);
(2).创建用户信息表
createtablebankcustomer
(
bc_idintidentity(1,1)primarykey,
bc_namechar(20)notnull,
bc_icnochar(18)notnullcheck(left(bc_icno,17)like'[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'and(right(bc_icno,1)like'[0-9]'orright(bc_icno,1)like'x')),
bc_telvarchar(20)notnullcheck((bc_tellike'[0-9][0-9][0-9][0-9]_[0-9][0-9][0-9][0-9][0-9][0-9][0-9]')or(bc_tellike'[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]')),
bc_addrvarchar(100)
);
(3).创建银行卡信息
createtablebankcard
(bc_nochar(19)notnull,
bc_pwdchar(6)notnull,
bc_currencychar(5)notnull,
bc_bbtidintnotnull,
bc_opendatedatenotnull,
bc_openamountmoneynotnull,
bc_reglosschar
(2),
bc_bcidintnotnull,
bc_existbalancemoneynotnull
)
altertablebankcard
addconstraintsp_bcno1primarykey(bc_no)
altertablebankcard
addconstraintsp_bcno2check(bc_nolike'10103576[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]')
altertablebankcard
addconstraintsp_bcopenamountcheck(bc_openamount>=1)
altertablebankcard
addconstraintsp_bcpwddefault('888888')forbc_pwd
altertablebankcard
addconstraintsp_bccurrencydefault('RMB')forbc_currency
altertablebankcard
addconstraintsp_bcopendatedefault(getdate())forbc_opendate
altertablebankcard
addconstraintsp_bcreglossdefault('否')forbc_regloss
(4).创建交易信息表
createtablebankdealinfo
(bd_nointidentity(1,1),
bd_bcnochar(19)notnull,
bd_dealdatedatenotnull,
bd_dealacountmoneynotnull,
bd_dealtypechar(10)notnull,
bd_dealcommentchar(100)
)
altertablebankdealinfo
addconstraintsp_bdnoprimarykey(bd_no)
altertablebankdealinfo
addconstraintsp_bddealdatedefault(getdate())forbd_dealdate
altertablebankdealinfo
addconstraintsp_bddealtypecheck(bd_dealtype='存入'orbd_dealtype='支取')
3.添加外键约束和生成数据库
代码如下:
usebankdb
go
altertablebankcard
addconstraintfk_bc_bbtforeignkey(bc_bbtid)referencesbankbusinesstype(bbt_id);
altertablebankcard
addconstraintfk_bc_bcforeignkey(bc_bcid)referencesBankCustomer(bc_id);
altertablebankDealInfo
addconstraintfk_bdi_bcforeignkey(bd_bcno)referencesBankCard(bc_no);
第3章:
创建触发器和插入测试数据
1.创建级联触发器
(1).创建Insert触发器:
if(object_id('tr_InsertdealInfo','tr')isnotnull)
droptriggertr_InsertdealInfo
go
createtriggertr_InsertdealInfo
onbankdealinfo
forinsert
as
declare@typechar(10),@summoney,@bdbcnochar(19);
--创建一个游标,指向inserted表
declarecursor_bankdealinfocursorforselectbd_dealtype,bd_dealacount,bd_bcnofrominserted
--打开游标
opencursor_BankDealinfo
--取游标中各个字段的值复制给各个变量
fetchnextfromcursor_BankDealinfointo@type,@sum,@BDBCNo
while@@fetch_status=0
begin
--判断交易记录里是存入还是支取,及时更新银行卡表的存款余额
if(rtrim(ltrim(@type))='存入')
updatebankcardsetBC_ExistBalance=BC_ExistBalance+@sumwhereBC_No=@BDBCNo;
if(rtrim(ltrim(@type))='支取')
updatebankcardsetBC_ExistBalance=BC_ExistBalance-@sumwhereBC_No=@BDBCNo;
fetchnextfromcursor_BankDealinfointo@type,@sum,@BDBCNo
end
closecursor_BankDealinfo
deallocatecursor_BankDealinfo
Go
(2).创建Delete触发器
if(object_id('tr_DeldealInfo','tr')isnotnull)
droptriggertr_DeldealInfo
go
createtriggertr_DeldealInfo
onbankdealinfo
fordelete
as
declare@typechar(10),@summoney,@BDBCNochar(19);
--创建一个游标,指向deleted表
declarecursor_BankDealinfocursorforselectBD_DealType,BD_DealAcount,BD_BCNofromdeleted
--打开游标
opencursor_BankDealinfo
--取游标中各个字段的值复制给各个变量
fetchnextfromcursor_BankDealinfointo@type,@sum,@BDBCNo
while@@fetch_status=0
begin
if(rtrim(ltrim(@type))='存入')
updatebankcardsetBC_ExistBalance=BC_ExistBalance-@sumwhereBC_No=@BDBCNo;
if(rtrim(ltrim(@type))='支取')
updatebankcardsetBC_ExistBalance=BC_ExistBalance+@sumwhereBC_No=@BDBCNo;
fetchnextfromcursor_BankDealinfointo@type,@sum,@BDBCNo
end
closecursor_BankDealinfo
deallocatecursor_BankDealinfo
Go
(3).创建update触发器:
if(object_id('tr_DeldealInfo','tr')isnotnull)
droptriggertr_DeldealInfo
go
createtriggertr_DeldealInfo
onbankdealinfo
forupdate
as
declare@typechar(10),@summoney,@BDBCNochar(19);
--创建一个游标,指向deleted表
declarecursor_BankDealinfocursorforselectBD_DealType,BD_DealAcount,BD_BCNofromupdated
--打开游标
opencursor_BankDealinfo
--取游标中各个字段的值复制给各个变量
fetchnextfromcursor_BankDealinfointo@type,@sum,@BDBCNo
while@@fetch_status=0
begin
if(rtrim(ltrim(@type))='存入')
updatebankcardsetBC_ExistBalance=BC_ExistBalance-@sumwhereBC_No=@BDBCNo;
if(rtrim(ltrim(@type))='支取')
updatebankcardsetBC_ExistBalance=BC_ExistBalance+@sumwhereBC_No=@BDBCNo;
fetchnextfromcursor_BankDealinfointo@type,@sum,@BDBCNo
end
closecursor_BankDealinfo
deallocatecursor_BankDealinfo
go
2.插入数据表的测试数据
1.BankBusinessType表的测试数据
代码如下:
insertintobankbusinesstype
values
('活期','无固定存期,可随时存取,存取金额不限的一种比较灵活的存款'),
('定活两便','事先不约定存期,一次性存入,一次性支取的存款'),
('通知','不约定存期,支取时需提前通知银行,约定支取日期和金额方能支取的存款'),
('整存整取1年','整笔存入,到期提取本息'),
('整存整取2年','整笔存入,到期提取本息'),
('整存整取3年','整笔存入,到期提取本息'),
('零存整取1年','事先原定金额,逐月按约定金额存入,到期支付本息'),
('零存整取2年','事先原定金额,逐月按约定金额存入,到期支付本息'),
('零存整取3年','事先原定金额,逐月按约定金额存入,到期支付本息'),
('自助转账','银行ATM机上办理银行卡之间互相划转');
select*frombankbusinesstype
结果如下图所示:
图1
2.BankCustomer表的测试数据
insertintobankcustomer
values
('小明','','','包头市昆都仑区包钢五中'),
('小黑','54','','包头昆区阿尔丁大街');
select*frombankcustomer
结果如下图所示:
图2
3.BankCard表的测试数据
declare@datedatetime
select@date=cast(DATEADD(DD,-(rand()*30),GETDATE())asdatetime)--前30天的日期
insertintoBankCard
values('1010357612345678','197611','RMB',1,@date,'1000.00','否',1,'1000.00');
select@date=cast(DATEADD(DD,-(rand()*30),GETDATE())asdatetime)
insertintoBankCard
values('1010357612345688','197711','RMB',2,@date,'1500.00','否',2,'1500.00');
select*fromBankCard
结果如下图所示:
图3
4.BankDealInfo表的测试数据
declare@date1datetime
select@date1=cast(DATEADD(DD,-(rand()*15),GETDATE())asdatetime)
insertintoBankDealInfo
values('1010357612345678',@date1,'500.00','存入','单位1月工资')
select@date1=cast(DATEADD(DD,-(rand()*15),GETDATE())asdatetime)
insertintoBankDealInfo
values('1010357612345678',@date1,'1500.00','存入','单位2月工资')
select@date1=cast(DATEADD(DD,-(rand()*15),GETDATE())asdatetime)
insertintoBankDealInfo
values('1010357612345678',@date1,'600.00','支取','支付宝付款')
select@date1=cast(DATEADD(DD,-(rand()*15),GETDATE())asdatetime)
insertintoBankDealInfo
values('1010357612345678',@date1,'700.00','支取','刷卡消费');
select@date1=cast(DATEADD(DD,-(rand()*15),GETDATE())asdatetime)
insertintoBankDealInfo
values('1010357612345688',@date1,'3000.00','存入','单位1月工资')
select@date1=cast(DATEADD(DD,-(rand()*15),GETDATE())asdatetime)
insertintoBankDealInfo
values('1010357612345688',@date1,'2800.00','存入','单位2月工资')
select@date1=cast(DATEADD(DD,-(rand()*15),GETDATE())asdatetime)
insertintoBankDealInfo
values('1010357612345688',@date1,'1600.00','支取','支付宝付款')
select@date1=cast(DATEADD(DD,-(rand()*15),GETDATE())asdatetime)
insertintoBankDealInfo
values('1010357612345688',@date1,'900.00','支取','刷卡消费');
select*fromBankDealInfo
结果如下图所示:
图4
第四章:
模拟常规业务
1.修改客户密码
updateBankCardsetBC_Pwd=123456whereBC_No='1010357612345678';
updateBankCardsetBC_Pwd=123123whereBC_No='1010357612345688';
--修改密码后的查询显示
selectbc_noas'卡号',bc_pwdas'密码',BC_Currencyas'货币类型',BC_BBTIdas'储蓄类型',BC_OpenDateas'开户日期',BC_OpenAmountas'开户金额',BC_RegLossas'是否挂失',BC_BBTIdas'客户编号',BC_ExistBalanceas'存款余额'fromBankCard
结果如下图所示:
图5
2.办理银行卡挂失
select*fromBankCardwhereBC_No='1010357612345678';
updateBankCardsetbc_regloss='是'whereBC_No='1010357612345678';
selectBankCard.BC_Noas'卡号',BankCard.BC_Pwdas'密码',BankCard.BC_Currencyas'货币类型',BankBusinessType.BBT_Nameas'储蓄类型',BankCard.BC_OpenDateas'开户日期',BankCard.BC_OpenAmountas'开户金额',BankCard.BC_RegLossas'是否挂失',BankCustomer.BC_Nameas'客户姓名',BankCard.BC_ExistBalanceas'存款余额'fromBankCard
innerjoinBankBusinessTypeonBankCard.BC_BBTId=BankBusinessType.BBT_Id
innerjoinBankCustomeronBankCard.BC_BCId=BankCustomer.BC_Id
Go
结果如下图所示:
图6
3.统计银行资金流通余额和盈利结算
ifexists(select*fromsysobjectswherename='proc_staticsBanlanceAndProfit')
dropprocedureproc_staticsBanlanceAndProfit
go
createprocedureproc_staticsBanlanceAndProfit
as
declare@YUmoney;
declare@YINGmoney;
declare@INmoney;
declare@OUTmoney
select@IN=sum(bd_dealacount)fromBankDealInfowherertrim(ltrim(BD_DealType))='存入';
select@OUT=sum(BD_DealAcount)fromBankDealInfowherertrim(ltrim(BD_DealType))='支取';
set@YU=@IN-@OUT;
set@YING=@IN*0.008-@OUT*0.003;
print'存入总金额:
'+rtrim(ltrim(str(@IN)))+'RMB,支取总金额:
'+rtrim(ltrim(str(@OUT)))+'RMB,银行流通余额:
'+rt