1. 程式人生 > >ATM取款機資料庫設計

ATM取款機資料庫設計

/*ATM取款機系統資料庫設計*/


/*
某銀行擬開發一套ATM取款機系統,實現如下功能:
1、開戶(到銀行填寫開戶申請單,卡號自動生成)
2、取錢
3、存錢
4、查詢餘額
5、轉賬(如使用一卡通代繳手機話費、個人股票交易等)
現要求對“ATM櫃員機系統”進行資料庫的設計並實現,資料庫儲存在D:\bank目錄下,檔案增長率為15% 。

*/


--建立資料庫
if exists(select * from sysdatabases where name='BankDB')
drop database BankDB
create database BankDB
on(
	name='BankDBmdf',
	filename='d:\SQL2008Workspace\BankDB.mdf',
	size=5mb,
	maxsize=15mb,
	filegrowth=15%
)
log on
(
	name='BankDBldf',
	filename='d:\SQL2008Workspace\BankDB.ldf',
	size=5mb,
	maxsize=15mb,
	filegrowth=15%
)
go


--建立使用者資訊表
use BankDB
if exists(select * from sysobjects where name ='userInfo')
drop table userInfo
create table userInfo
(
	customerID int not null  identity(1,1),--客戶編號
	customerName nvarchar(8) not null,--開戶名
	pID varchar(20) not null, --身份證號
	telephone varchar(13) not null,--電話號碼
	uaddress nvarchar(50)--家庭住址
)
go
--新增約束
alter table userInfo 
add constraint PK_customer primary key (customerID),--主鍵約束
    constraint UQ_pID unique (pID),--唯一約束
    constraint CK_piD check (len(pID)=15 or len(pID)=18),--檢查約束
    constraint CK_telephone check (telephone like '[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]' or telephone 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]')--檢查約束
go


--建立銀行卡資訊表
use BankDB
if exists(select * from sysobjects where name='cardInfo')
drop table cardInfo
create table cardInfo    
(
	cardID varchar(18) not null,--銀行卡號
	curType varchar(3) not null,--貨幣種類
	savingType nvarchar(4) not null,--存款型別
	openDate datetime not null,--開戶日期
	openMoney money not null,--開戶金額
	balance money not null,--餘額
	pass char(6) not null,--密碼
	isReportPass nvarchar(2) not null,--是否掛失
	customerID int not null--顧客編號	
)
go
--新增約束
alter table cardInfo
add constraint PK_cardID primary key (cardID),--主鍵約束
	constraint CK_cardID check (cardID like '1010 3576 [0-9][0-9][0-9][0-9] [0-9][0-9][0-9]'),--檢查約束
	constraint DF_curType default ('RMB') for curType,--預設約束
	constraint CK_savingType check (savingType = '活期' or savingType = '定期' or savingType = '定活兩便'),--檢查約束
	constraint DF_opendate default (getdate()) for opendate,--預設約束
	constraint CK_openMoney check (openMoney>=1),--檢查約束
	constraint CK_balance check (balance>=1),--檢查約束
	constraint CK_pass check (pass like '[0-9][0-9][0-9][0-9][0-9][0-9]'),--檢查約束
	constraint DF_pass default ('888888') for pass,--預設約束
	constraint CK_isReportPass check (isReportPass = '是' or isReportPass = '否'),
	constraint DF_isReportPass default ('否') for isReportPass,
	constraint FK_customerID foreign key (customerID) references userInfo(customerID)--外來鍵約束
go


--建立交易資訊表
use BankDB
if exists(select * from sysobjects where name='transInfo')
drop table transInfo
create table transInfo
(
	transDate datetime not null,--交易日期
	cardID varchar(18) not null,--卡號
	transType nvarchar(4) not null,--交易型別
	transMoney money not null,--交易金額
	remark nvarchar(50)--備註
) 
go
--新增約束
alter table transinfo
add constraint DF_transDate default (getdate()) for transDate,--預設約束
    constraint FK_cardID foreign key (cardID) references cardInfo(cardID),--外來鍵約束
    constraint CK_transType check (transType = '存入' or transType = '支取'),--檢查約束
    constraint CK_transMoney check (transMoney>0 )
go




--給衛莊和蓋聶開戶
insert into userInfo(customerName,pID,telephone,uaddress) values('衛莊','123456789123456789','13921210101','韓國新鄭')
insert into userInfo(customerName,pID,telephone,uaddress) values('蓋聶','123456780123456780','0712-81210101','秦國咸陽')

insert into cardInfo (cardID,savingType,openMoney,balance,pass,customerID) values ('1010 3576 6221 543','活期',1000,1000,'123456',1)
insert into cardInfo (cardID,savingType,openMoney,balance,customerID) values ('1010 3576 3890 871','定期',999,999,2)

select * from userInfo
select * from cardInfo
go
--衛莊取錢500,蓋聶存錢1001
insert into transInfo (cardID,transType,transMoney) values ('1010 3576 6221 543','支取',500)
update cardInfo set balance=balance-500 where cardID='1010 3576 6221 543'
insert into transInfo (cardID,transType,transMoney) values ('1010 3576 3890 871','存入',1001)
update cardInfo set balance=balance+1001 where cardID='1010 3576 3890 871'
select * from transInfo 
select * from cardInfo 
go

--蓋聶修改密碼和掛失賬號
update cardInfo set pass=654321 where cardID='1010 3576 3890 871'
update cardInfo set isReportPass = '是' where cardID = '1010 3576 3890 871'
select * from cardInfo
go

--給cardID建立非聚集索引
create nonclustered index index_cardID on transInfo(cardID) with fillfactor=60
go
--根據索引進行查詢
select * from transInfo with (index=index_cardID) where cardID = '1010 3576 3890 871'
go
--建立檢視:查詢各表要求欄位為中文欄位名
create view view_user
as
	select  customerID '客戶編號',customerName as '開戶名','身份證號'=pID,
	telephone '電話號碼',uaddress '居住地址'
	from userInfo
go
select * from view_user


/*---建立儲存過程(獲取卡號)---*/
if exists (select * from sysobjects where name='pro_getcID')
drop procedure pro_getcID

create procedure pro_getcID @randID char(18) output
as
	declare @r numeric(15,8)
	declare @tempStr char(10)
	--隨機函式
	select @r=rand(datepart(mm,getdate())*100000 + datepart(ss,getdate())*1000 + datepart(ms,getdate()) )
	set @tempStr=convert(char(10),@r)
	--substring是返回指定位置的字串,從@tempStr字串第4個字元開始,返回長度為4的字元
	set @randID='1010 3576'+' '+substring(@tempStr,4,4)+' '+substring(@tempStr,8,3)
go
--測試產生隨機卡號
declare @cardID varchar(18)
exec pro_getcID @cardID output
print '產生的隨機卡號為:'
[email protected]
go /*---建立儲存過程(開戶)---*/ if exists (select * from sysobjects where name = 'pro_openAccount') drop procedure pro_openAccount create procedure Pro_openAccount @customerName nvarchar(8),@pID varchar(18),@telephone varchar(13), @openMoney money,@savingType varchar(4),@uaddress nvarchar(50)=' ' as declare @cardID char(18) declare @customerID int exec pro_getcID @cardID output while exists(select * from cardInfo where cardID
[email protected]
) begin exec pro_getcID @cardID output end print '尊敬的客戶,開戶成功!系統為您產生的隨機卡號為:'[email protected] print '開戶日期'+convert(char(10),getdate(),111)+'開戶金額'+convert(varchar(20),@openMoney) if exists(select * from userInfo where @pID=pID) begin update userInfo set [email protected]
,[email protected] select @customerID=customerID from userInfo where @pID=pID insert into cardInfo (cardID,savingType,openMoney,balance,customerID) values (@cardID,@savingType,@openMoney,@openMoney,@customerID) end else begin insert into userInfo (customerName,pID,telephone,uaddress) values (@customerName,@pID,@telephone,@uaddress) select @customerID=customerID from userInfo where @pID=pID insert into cardInfo (cardID,savingType,openMoney,balance,customerID) values (@cardID,@savingType,@openMoney,@openMoney,@customerID) end go --呼叫儲存過程開戶 set nocount on--不顯示"受影響的行數資訊" set nocount off--顯示"受影響的行數資訊" EXEC pro_openAccount '王五','334456889012678','2222-63598978',1000,'活期','河南新鄉' EXEC pro_openAccount '李四','213445678912342222','0760-44446666',1,'定期', go /*---取錢或存錢的儲存過程---*/ if exists (select * from sysobjects where name = 'pro_playMoney') drop procedure pro_playMoney create procedure pro_playMoney --輸入引數 @cardID varchar(18),@transType nvarchar(4),@transMoney money,@pass char(6)='' as print '交易正在進行中......' declare @balance money select @balance=balance from cardInfo where [email protected] if (@transType='支取') begin if (@pass=(select pass from cardInfo where [email protected])) begin if(@balance>[email protected]+1) begin update cardInfo set [email protected] where [email protected] insert into transInfo (cardID,transType,transMoney) values (@cardID,@transType,@transMoney) print '交易成功! 交易金額:'+convert(varchar(10),@transMoney) select @balance=balance from cardInfo where [email protected] print '卡號:'[email protected]+'餘額:'+convert(varchar(10),@balance) end else begin raiserror('交易失敗,餘額不足!',16,1) print '卡號:'[email protected]+'餘額:'+convert(varchar(10),@balance) return end end else begin raiserror('密碼錯誤',16,1) return end end if(@transType='存入') begin update cardInfo set [email protected] where [email protected] insert into transInfo (cardID,transType,transMoney) values (@cardID,@transType,@transMoney) print '交易成功! 交易金額:'+convert(varchar(10),@transMoney) select @balance=balance from cardInfo where [email protected] print '卡號:'[email protected]+'餘額:'+convert(varchar(10),@balance) end go --衛莊存1000,蓋聶取600 exec pro_playMoney '1010 3576 6221 543','存入',1000 exec pro_playMoney '1010 3576 3890 871','支取',600,'654321' go --統計銀行的流通餘額和盈利結算 declare @inMoney money declare @outMoney money declare @profit money select @inMoney=sum(transMoney) from transInfo where transType='存入' select @outMoney=sum(transMoney) from transInfo where transType='支取' print '銀行的流通餘額總計為:'+convert(varchar(20),@[email protected])+'RMB' set @[email protected]*[email protected]*0.003 print '盈利結算為:'+convert(varchar(20),@profit)+'RMB' go --查詢本週開戶的卡號,顯示該卡的相關資訊 select * from cardInfo where datediff(day,getdate(),openDate)<datepart(weekday,getdate()) --查詢本月交易金額最高的卡號 select cardID from transinfo where transMoney=(select max(transMoney) from transInfo) --查詢掛失賬號的客戶資訊 select * from userInfo where customerID in (select customerID from cardInfo where isReportPass='是') --提醒資訊:當發現客戶賬戶餘額少於200,致電提醒 select customerName,cardID,balance,telephone from userInfo u,cardInfo c where u.customerID=c.customerID and balance<200 /*---轉賬的儲存過程---*/ if exists(select * from sysobjects where name='pro_exMoney') drop procedure pro_exMoney create procedure pro_exMoney @cardID1 char(18),@cardID2 char(18),@transMoney money as print '開始轉賬,請稍後......' begin transaction declare @error int set @error=0 exec pro_playMoney @cardID1,'支取',@transMoney,123456 set @[email protected][email protected]@ERROR exec pro_playMoney @cardID2,'存入',@transMoney set @[email protected][email protected]@ERROR if(@error<>0) begin print '轉賬失敗!' rollback transaction end else begin print '轉賬成功!' commit transaction end go --衛莊給蓋聶轉賬2000 exec pro_exMoney '1010 3576 6221 543','1010 3576 3890 871',2000 --賬戶安全 --1.新增SQL登入賬號 if exists(select * from syslogins where loginname='haha') exec sp_droplogin 'haha'--刪除SQL登入賬號 begin exec sp_addlogin 'haha','1234'--新增SQL登入賬號 exec sp_defaultdb 'haha','BankDB'--修改登入的預設資料庫時BankDB end go --2.建立資料庫使用者 exec sp_grantdbaccess 'haha','dbuser' go --3.授予資料庫使用許可權,為dbuser分配物件許可權(增刪改查的許可權) grant insert,delete,update,select on userInfo to dbuser grant insert,delete,update,select on cardInfo to dbuser grant insert,delete,update,select on transInfo to dbuser go

相關推薦

ATM取款機資料庫設計

/*ATM取款機系統資料庫設計*/ /* 某銀行擬開發一套ATM取款機系統,實現如下功能: 1、開戶(到銀行填寫開戶申請單,卡號自動生成) 2、取錢 3、存錢 4、查詢餘額 5、轉賬(如使用一卡通代繳手機話費、個人股票交易等) 現要求對“ATM櫃員機系統”進行資料庫的設

使用Java實現數據庫編程—06 項目:銀行ATM取款機系統

有時 drop user select 普通 語句 不可 dos word rop 1、 創建普通用戶: 語法: CREATE USER `user`@`host` [IDENTIFIED ‘password‘]; //user:用戶名,host:

資料庫設計一二三四正規化有何區別

範化是在識別資料庫中的資料元素、關係、以及定義所需的表和各表中的專案這些初始化工作之後的一個細化的過程。常見的正規化有1NF 2NF 3NF BCNF以及4NF。 1NF,第一正規化。第一正規化是指資料庫表的每一列都是不可分割的基本資料項,同一列中不能有多個值,即實體中的某個屬性不能有多個值或者

第七章 資料庫設計

資料庫設計 資料庫設計是指對於一個給定的應用環境,構造(設計)優化的資料庫邏輯模式和物理結構,並據此建立資料庫及其應用系統,使之能夠有效地儲存和管理資料,滿足各種使用者的應用需求,包括資訊管理要求和資料操作要求。 資訊管理要求:在資料庫中應該儲存和管理哪些資料物件 。 資料操作要求:對資料物件需要進

#資料庫設計規範

資料庫設計規範, 一二三正規化,E-R模型 1.資料庫表的設計正規化(三正規化和反正規化) E-R圖的基本成分包括實體型別、屬性和聯絡 1. 實體:用矩形表示,框內註明實體名稱。 2. 屬性;用橢圓表示,框內標註屬性名稱,並用無向邊

站內信的資料庫設計

站內信總體可以分為兩種:點到點,點到面 點到點即使用者給使用者,管理員給使用者 點到面即管理員給使用者組 點到點的設計 若只存在點到點或使用者量很少的情況下用一張表既可以 列名 含義 sen

談談企業資訊系統資料庫設計是使用id主鍵還是uuid邏輯主鍵或業務主鍵

  企業資訊系統泛指企業ERP、OA、MES等企業管理軟體,這些系統都有共性:業務層面較技術層面更加複雜,體現在資料庫上就是業務表往往欄位很多,超過4-5個欄位的業務主鍵隨處可見。從10餘年的企業資訊化系統建設及當下分散式應用出發,談談在企業資訊化系統中應該如何設計資料表主鍵。 一、資料

談談企業資訊系統tag標籤資料庫設計及基於多選元件bootstrap-select的實現

一、摘要 Tag標籤類似於分類,可以用於標記、區分事物,但又不同於分類,通常分類是單一所屬,而Tag往往是多個。如純淨水596ml它屬於純淨水分類,可以標記:596ml、純淨水、掃碼有獎等tag。本文討論限於企業資訊系統中的tag標籤應用,涉及2部分內容:tag標籤資料庫設計,前端頁面如

資料庫設計之三大正規化NF

       國內絕大多數院校用的王珊的《資料庫系統概論》這本教材,某些方面並沒有給出很詳細很明確的解釋,與實際應用聯絡不那麼緊密,你有這樣的疑問也是挺正常的。我教《資料庫原理》這門課有幾年了,有很多學生提出了和你一樣的問題

從零打造一個CMDB(一)資料庫設計

俠義的CMDB都是偏向純資產管理,但運維繫統往往圍繞著這些資產中心,從資產進行不斷外充擴容 在其基礎之外擴展出各功能,通過cmdb 擴展出各個子系統  涉及工具:workbench 一個例子:設計一個數據庫實現主機資訊、交換機資訊,如何將之間的資訊關聯起來 初步的傳統設計:

酒店管理系統-資料庫設計說明書

資料庫設計說明書 1引言 1.1編寫目的 本文件為**酒店管理系統需求分析報告,為**酒店管理系統的設計的主要依據,主要針對**酒店管理系統的概要設計和詳細設計人員,作為專案驗收的主要依據。 1.2背景 本軟體全稱為**酒店管理系統。 軟體適用於普通二星級酒店、賓館。 1

oracle資料庫設計經驗

一、實體與表對應關係 表<=>實體,欄位<=>屬性。 二、表與表的關係(實體間的關係):一對一、一對多、多對多 一對一:一條記錄只對應其他表中的一條記錄有關係 學生基本資訊表t_student,成績表t_studentScore含有一個外來鍵st

【學習記錄】第一章 資料庫設計-《SQL Server資料庫設計和開發基礎篇視訊課程》

一、課程筆記 1.1  軟體開發週期   (1)需求分析階段   分析客戶的業務和資料處理需求。 (2)概要設計階段   設計資料庫的E-R模型圖,確認需求資訊的正確和完整。 /*   E-R圖:實體-關係圖(Entity Relationship Diagram),提供了

評論模組 - 後端資料庫設計及功能實現

評論模組在很多系統中都有,CodeRiver河碼 作為類似程式設計師客棧的溝通協作平臺自然也不會少。 前端介面是參考了簡書的評論模組,專門寫了一篇文章介紹實現步驟: vue + element-ui + scss 仿簡書評論模組 感興趣的可以看看。 專案地址:github.com/cachecats/c…

連線查詢和資料庫設計

-- 連線查詢 -- inner join ... on -- 兩個表連線查詢 select * from students inner join classes -- 查詢能夠對應班級的學生以及班級資訊 select * from students inner join classes on student

充值系列—充值系統資料庫設計(一)

在我們的遊戲充值模組中,接入了支付寶,蘋果,Paypal, googleplay , mycard, mol, 360,機鋒,91等各種充值渠道。這篇文章(包括接下來的幾篇文章)將對充值系統的需求,資料庫設計,構架,充值流程,安全處理,各種渠道的詳細接入方式等各個方面做出詳細的說明。 充

資料庫設計之反三正規化的理解

反三正規化是基於第三正規化所調整的,沒有冗餘的資料庫未必是最好的資料庫,有時為了提高執行效率,就必須降低正規化標準,適當保留冗餘資料。具體做法是: 在概念資料模型設計時遵守第三正規化,降低正規化標準的工作放到物理資料模型設計時考慮。降低正規化就是增加欄位,減少了查詢時的關聯,提高查詢效率,因為在資料

資料庫設計之三正規化的的理解

目的:  為了降低資料冗餘,消除資料插入異常、更新異常、刪除異常。在設計資料庫時正規化要求越嚴謹則設計出來的表則越多資料結構越靈活。 定義: 第一正規化(1NF):資料表中的每一列(每個欄位)必須是不可拆分的最小單元,也就是確保每一列的原子性; 第二正規化(2NF):滿足1NF後,

樹的資料庫設計

https://blog.csdn.net/xiaodingdou/article/details/53286503 Mysql中的遞迴層次查詢(父子查詢)   資料庫多層資料運用遞迴演算法生成樹形資料 https://blog.csdn.net/wuxianzhenjia

資料庫設計流程總結

一、專案中資料庫建庫套路       1、概念模型:就是從現實世界到資訊世界的第一層抽象,確定領域實體屬性關係等,使用E-R圖表示,E-R圖主要是由實體、屬性和聯絡三個要素構成的。       &nb