第9章 综合实战-银行ATM存取款机系统

在本章中需要掌握MySQL的用户管理,会使用SQL语句操作数据,会使用事物摆正数据的完整性,会创建并使用视图,会创建并使用索引,掌握数据库的备份和恢复,本章要求完成‘银行ATM存取款机系统’的设计与开发。

9.1 项目需求

某银行是一家民办的小型银行企业,现有十多万客户。现为该银行开发一套ATM存取款机系统,对银行日常的存取款业务进行管理,以保证数据的安全性,提高工作效率。
        要求根据银行存取款业务需求设计出符合第三范式的数据库结构,使用SQL创建数据库和表,并添加表约束,进行数据的增、删、改、查并按照银行的业务需求,运用视图和事物实现各项银行日常存款、取款和转账等业务曹组。

9.2 项目准备

1 环境准备

(1)数据库:MySQL5.7
(2)操作系统:Windows系列。

2技能准备

(1)会使用SQL语句创建数据库和表,并添加各种约束。
(2)会进行常见的SQL编程。
1 INSERT 语句 :开户。
2 UODATE语句:存款或取款
3 DELETE语句:销户
4 聚合函数:月末汇总。
(3)会进行安全管理
安全管理:添加ATM系统的系统维护账号。
(4)会使用子查询并进行查询优化。
1 子查询:查询挂失账户的客户信息和催款业务等。
2 查询优化:查询指定卡号的交易记录。
(5)创建并使用视图:查询各表时显示有好的中文字段名,
(6)会创建存储过程并使用事物处理:本银行内账户间的转账。

9.3 核心知识解耦--MySQL用户管理

        在数据库中,通常包含很多重要的、敏感的数据,为了确保这些数据的安全性和完整性,在MySQL中,通过为不同的MySQL用户赋予不同的权限来实现这一目的,MySQL中的用户分为root用户和普通用户两种,前者是超级管理员,拥有最高的数据库权限,可以进行一切数据操作;后者只能拥有该用户被赋予的权限。

1 创建普通用户

安装MySQL后默认提供root用户管理账号,由于root用户拥有超级用户权限,因此容易引发误操作所导致的数据不安全问题。在实际开发中,除了一些必要的场合外,一般不建议使用root用户登录MySQL服务器,DBA(数据库管理员)为不同的数据库使用者创建一系列普通地用户,赋予不同的权限,以保障数据的安全性。创建用户账户的语法格式如下:
CREATE USER 'username'@'host' [IDENTIFIED BY [PASSWORD] `password`] ;
其中,IDENTIFIED BY 语句用来设置密码,默认时密码为空。其它参数如下。
username:表示常见的用户名。
host:表示指定用户登录的主机名,如果只是本地用户可使用‘localhost’,如果该用户可登录任何远程主机,可使用通配符‘%’。
PASSWORD:表示使用哈希值设置密码,为可选项。
password:表示用户登录时所应用的明文密码。
【示例1】
创建本地用于teacher,密码为123456,本地用户student,不需要密码。
SQL语句如下
CREATE USER teacher@localhost IDENTIFIED BY 123456;
CREATE USER student@localhost;
创建用户之后,可通过系统数据库mysql中的user表,查看已存在的用户,SQL语句如下:
use mysql;
SELECT host,user,authentication_string,select_priv,Insert_priv,Update_priv,Delete_priv FROM user\G;
第9章 综合实战-银行ATM存取款机系统_第1张图片从图中可以看出,user表中的host,user,authentication_string分别对应创建用户时指定的主机名、用户名、密码的哈希值。除此之外,还有一系列以‘_priv’字符串结尾的字段,这些字段决定了用户权限,它们的值只有Y和N,Y表示用户有对应的权限,N表示用户没有对应的权限,默认值是N。不难看出,使用CREATE USER语句创建的用户是未授权的,下面介绍一种能够同时授权的创建用户方式。
注意:user表中User和Host字段区分大小写,如‘STUDENT’,‘student’是两个不同的客户,在条件查询时需要指定正确的用户名和主机名,
如果删除了user表中已经存在的用户,例如,删除已创建的student用户,然后重新创建student用户,可能会出现错误提示。如果遇到类似问题,可以先运行‘FLUSH PRIVILEGES’,然后再创建用户。


2 执行GRANT语句创建用户并授权

用户授权需使用GRANT语句,其语法格式如下:
GRANT priv_type ON databasename.tablename TO username@host [IDENTIFIED BY [PASSWORD] password][WITH GRANT OPTION];
priv_type:表示设置的用户操作权限,如果授予所有权限可使用ALL。MySQL中的权限有很多,以下列出了常用的数据库或表操作权限。
1CREATE和DROP权限,可以创建数据库和表,或删除已有数据库和表。
2 INSERT、DELETE、SELECT和UPDATE权限,允许在一个数据库现有的表上实现增、删、改、等操作。
3 ALTER权限,可以使用LTER TABLE来更改表的结构和重新命名表。
databasename.tablename:表示所创建用户账号的权限范围,即只能在指定数据库上使用此权限,如果给所有数据库和表授权,可以使用‘*.*’.
WITH GRANT OPTION:表示对新建立的用户赋予GRANT权限,可选项。
其余部分与CREATE USER语句一致。
【示例2】
创建名为xiaoming,密码为123456的本地用户账户,并给该用户赋予MySchool数据库中student表的增加数据和查询数据权限。
FLUSH PRIVILEGES;
GRANT INSERT,SELECT ON myschool.student TO xioaming@localhost IDENTIFIED BY '123456';

【示例3】
使用GRANT语句为已经创建的用户授权。
如为student@localhost用户授予MySchool数据库中view_student_result视图的查询权限。
GRANT SELECT ON myschool.view_student_result TO student@localhost;

3 使用mysqladmin命令修改root用户密码

grant all privileges on *.* to 'skip-grants user'@'skip-grants host' identified by ".";
mysqladmin -u username -p password 'newpassword';

【示例4】将root用户密码修改为1234
在DOS窗口中执行:
mysqladmin -u root -p password "1234";
使用mysql命令修改密码的用户应该为root用户。

4 使用SET命令修改用户密码

用户登录MySQL服务器后,可以使用SET命令修改当前用户密码,语法格式如下:
SET PASSWORD [FOR 'username'@host]=PASSWORD("newpassword");
其中PASSWORD()函数用于对密码加密,“newpassword”是设置的新密码。如果修改非当前登录用户的密码,则需使用FOR关键字指定要修改的用户名。
只有ROOT用户才能修改其他用户的密码,如果是普通用户,可省略FOR子句。

【示例5】
当登录用户为root时,使用SET命令将root密码修改为‘0000’,将teacher账户密码修改为‘8888’。

#修改当前登录用户密码
SET PASSWORD=PASSWORD("0000");
#修改其他用户密码
SET PASSWORD FOR teacher@loaclhost=PASSWORD("8888");

5删除普通客户

在MySQL数据库中,可以使用DROP USER语句删除普通用户,语法格式如下:
DROP USER username1@host [,username2@host];
该语句可以用于删除一个或多个MySQL普通用户。

【示例6】删除本地student用户
DROP USER student@localhost;

9.4 难点分析

该银行的ATM存取款业务如下
(1)银行未客户提供了各种银行存取款业务,如下:
 

业务 描述
活期 无固定存期,可随时存取,且存取金额不限的一种比较灵活的存款方式
定活两便 事先不约定存期,一次性存入,一次性支取的存款方式
通知 不约定存期,支取时需要提前通知银行,约定支取日期和金额方能支取的存款期限有1年、2年、3年
零存整取 一种事先约定金额,逐月按约定金额存入、到期支取本息的定期存储。银行提供的期限有1年,2年,3年
零存整取 一种事先约定金额,逐月按约定金额存入、到期支取本息的定期储蓄。银行提供的存款期限有1年,2年和3年
自动转账 在ATM存取款机上办理同一币种账户的银行卡之间的互相划转。

(2)每个客户凭个人身份证在银行可以开设多个银行账户。开设账户时,客户需要提供的开户数据如下:
 

数据 说明
姓名 必须提供
联系电话 必须提供
居住地址 必须提供

(3)银行为每个账户提供一张银行卡,每张银行卡可以存入一种币种的存款:银行卡账户信息如下:
 

数据 说明
卡号 银行卡号由16位数字组成。其中,一般前8位代表特殊意义,如果某行某支行等,假定该行要求其营业厅的卡号格式为10103576XXXXXXXX
密码 由6位数字构成,开户时默认为‘888888’
币种 默认为RMB,目前该银行尚未开设其他币种存款业务
存款类型 必填
开户日期 客户开设银行卡账户的日期,默认为当日
开户金额 客户最终的存款金额,默认为1元
余额 客户最终的存款金额,默认为1元
是否挂失 默认为‘0’,表示否‘1’表示是

(4)客户持银行卡在ATM存取款机上输入密码,经系统验证身份后可以办理存款、取款和转账等业务。银行在为客户办理业务时,需要记录每一笔账,账目交易信息表:
 

数据 说明
卡号 银行卡号由16位数字组成
交易日期 默认为当日
交易金额 实际交易金额
交易类型 包括存入和支取两种
备注 对每笔交易作必要的说明

(5)该银行要求这套软件能实现银行客户的开户、存款、取款、转账各余额查询等业务,摆正银行储蓄业务方便、快捷,同时保证银行业务数据的安全性。
(6)为了使开发人员尽快了解银行业务,该银行提供了银行卡手工账户和存取款单据的样本数据,仅供项目开发时参考。
银行卡手工账户信息

账户姓名 身份账号 联系电话 住址 卡号 存款类型 开户日期 开户金额 密码 存款余额 账户状态
刘二 **** 1111 北京西城区 1010 定期 2019-7-21 100 100 100

银行卡存取款单据样本数据
 

交易日期 交易类型 卡号 交易金额 余额 备注
2019-7-25 支取 1010 900 100 2019-7-25

9.5 项目实现思路

1 数据库设计

(1)完成银行ATM存取款机系统数据库设计
明确银行ATM存取款机系统地实体、实体属性以及实体之间的关系。
提示:在充分理解银行业务需求后,围绕银行的需求进行分析,确认与银行ATM存取款机有紧密关系的实体,并得到每个实体的必要属性。
(2)根据业务需求分析多个实体之间的关系,实体之间的关系可以是一对一、一对多和多对多
(2)为银行ATM存取款机系统数据库绘制E-R图。要求如下:
1 使用数据库设计工具,把设计数据库第一步的结果(即分析得到的银行ATM存取款机系统地实体,实体属性以及实体之间的关系),用E-R图表示。
2 E-R图中要体现各实体之间的关系。
(3)为银行ATM存取款机绘制数据库模型图,要求如下;
1 使用数据库设计工具,把E-R图中的实体转换为数据库中的表对象,并为表中每一列指定数据类型和长度。
2 在数据库模型汇总要标识表的主键和外键。
(4)规范数据库结构设计
使用第三范式对数据库表结构进行规范化。
提示:规范数据库表结构的同时,要考虑软件运行性能。必要时可以违反第三范式的要求,适当增加冗余数据,减少表链接,以空间换时间。

2 创建数据库以及登录用户并授权

(1)创建数据库
使用CREATE DATABASE语句创建ATM存取款机系统数据库bankDB。
创建数据库时要求检测是否存在数据库bankDB,如果存在,则因该先删除再创建。
(2)创建登录用户并授权
创建普通用户bankMaster,可以再任意主机登录MySQL服务器,具有数据库bankDB的所有权限,密码为1234.
从系统数据MySQL的user表中查看已创建的用户信息。
使用bankMaster用户登录MySQL服务器
 

3 创建表、约束

(1)创建表
根据前面设计出的ATM存取款机系统地数据库结构,使用CREATE TABLE语句创建表结构。
创建表时要求检测是都存在该表结构,如果存在,则应该先删除再创建。
(2)创建外键约束根据银行业务,为相应的表添加外键约束,使用ALTER TABLE ADD语句。
在为表添加外键约束时,要先添加主表的主键约束,再添加子表的外键约束。

4 插入测试数据

(1)使用SQL语句向已经创建数据库的每个表中插入测试信息。
(2)卡号由人工指定,向相关表中插入如下数据:
 

姓名 交易类型 身份证号 联系电话 地址 开户金额 存款类型 卡号
张三 开户 *** 010 北京海淀 1000 活期 1010
李四 开户 *** 0478 山东济南 1 定期 1010

(3)插入交易信息:张三的卡号取款900元,李四的卡号存款5000元,要求保存交易记录,以便客户查询和进行银行业务统计。
        例如,当张三取款900元时,会向交易信息表(transInfo)中添加一条交易数据,同时应自动更新银行卡信息表(cardInfo)中现有约(减少900元)
注意:插入测试数据时需要注意以下几点。
(1)在使用SQL语句插入各表中的数据时要保证业务数据的一致性和完整性。
(2)当客户持银行卡办理存款、取款业务时,银行要记录每笔交易账目,并修改该银行卡的存款金额。
(3)每个表至少要插入3-5条记录。

提示:注意各表中数据插入的顺序,为了保证主外键的关系,建议先插入主表中的数据,在插入子表中的数据。
(2)客户取款时需要记录‘交易账目’,并修改存款金额,它可能需要分为一下两不完成。
在交易信息表中插入交易记录
INSERT INTO transInfo (transType,cardId,transMoney) VALUES('支取','1010',900);
2更新银行卡信息表中的现有余额
UPDATE cardInfo SET balance=balance-900 WHERE cardID='1010';

5 模拟常规业务

编写SQL语句实现银行的如下日常业务。
(1)修改客户密码
修改张三的银行卡密码为12345,修改李四的密码为12332
(2)办理银行卡挂失
李四由于银行卡丢失,申请挂失。
(3)统计银行总存入金额和总支取金额
(4)查询本周开户信息
提示:查询本周开户的卡号。
(5)查询本月交易金额最高的卡号。
(6)查询挂失客户。
(7)催款业务。

6 创建、使用客户友好信息视图

(1)为了向客户提供友好的用户界面,使用SQL语句创建如下三个视图,并使用这些视图查询输出各表信息。
view_userInfo:输出银行客户记录。
view_cardInfo:输出银行卡记录
view_transInfo:输出银行卡的交易记录。
(2)各表显示的列全为中文。
 

7 创建存储过程完成转账

从卡号为‘1010’的账户中转出300元给卡号‘1010’的账户,即李四转账300元给张三。要求:创建存储过程,并使用事务处理。转账成功时,提交事物。

你可能感兴趣的:(MySQL数据库应用技术及实战,数据库,mysql,数据结构)