

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、<p> 《數據庫技術與開發(fā)》</p><p><b> 項目實訓設計報告</b></p><p> 項目名稱:銀行ATM存取款機系統(tǒng)設計與實現</p><p><b> 一、項目背景3</b></p><p><b> 1、項目任務3</b></
2、p><p> 2、項目技能目標3</p><p><b> 3、需求概述3</b></p><p><b> 4、開發(fā)環(huán)境3</b></p><p><b> 5、問題分析4</b></p><p> 二、項目實訓內容6</p>
3、;<p> 1、實訓一:制定《數據庫設計與編程規(guī)范》6</p><p> 2、實訓二:數據庫分析設計與建模12</p><p> 3、實訓三:創(chuàng)建數據庫14</p><p> 4、實訓四:創(chuàng)建觸發(fā)器和插入測試數據19</p><p> 5、實訓五:模擬常規(guī)業(yè)務26</p><p>
4、6、實訓六:創(chuàng)建、使用視圖30</p><p> 7、實訓七:存儲過程實現業(yè)務處理33</p><p> 8、實訓八:利用事務實現轉賬49</p><p><b> 8、心得體會54</b></p><p><b> 一、項目背景</b></p><p>&l
5、t;b> 1、項目任務</b></p><p> 使用PowerDesigner完成數據庫設計</p><p> 創(chuàng)建數據庫、創(chuàng)建表、創(chuàng)建約束</p><p> 使用觸發(fā)器和插入測試數據</p><p> 模擬常規(guī)業(yè)務、創(chuàng)建視圖</p><p> 使用存儲過程實現業(yè)務處理</p>
6、;<p> 利用事務實現較復雜的數據更新</p><p><b> 2、項目技能目標</b></p><p> 使用PowerDesigner完成數據庫概念模型和數據庫物理模型設計。</p><p> 使用T-SQL語句創(chuàng)建數據庫、表和各種約束。</p><p> 使用T-SQL語句編程實現常見業(yè)
7、務。</p><p> 使用觸發(fā)器實現多表之間的級聯更新。</p><p> 使用事務和存儲過程封裝業(yè)務邏輯。</p><p> 使用視圖簡化復雜的數據查詢。</p><p> 使用游標技術實現結果集的行集操作。</p><p><b> 3、需求概述</b></p>&l
8、t;p> 某銀行是一家民辦的小型銀行企業(yè),現有十多萬客戶,公司將為該銀行開發(fā)一套ATM存取款機系統(tǒng),對銀行日常的存取款業(yè)務進行計算機管理,以便保證數據的安全性,提高工作效率。</p><p> 要求根據銀行存取款業(yè)務需求設計出符合第三范式的數據庫結構,使用T-SQL語言創(chuàng)建數據庫和表,并添加表約束,進行數據的增刪改查,運用邏輯結構語句、事務、視圖和存儲過程,按照銀行的業(yè)務需求,實現各項銀行日常存款、取款
9、和轉賬業(yè)務。</p><p><b> 4、開發(fā)環(huán)境</b></p><p> 數據庫:SQL SERVER 2008開發(fā)版</p><p> 數據庫建模工具:PowerDesigner15</p><p><b> 問題分析</b></p><p> 該項目的AT
10、M存取款機業(yè)務如下:</p><p> (1) 銀行存取款業(yè)務介紹</p><p> 銀行為客戶提供了各種銀行存取款業(yè)務。詳見表1</p><p><b> 銀行存取款業(yè)務</b></p><p><b> (2) 客戶信息</b></p><p> 每個客戶憑
11、個人身份證在銀行可以開設多個銀行卡賬戶,開設賬戶時,客戶需要提供的開戶數據如表2所示:</p><p> 開設銀行卡賬戶的客戶信息</p><p> (3) 銀行卡賬戶信息</p><p> 銀行為每個賬戶提供一個銀行卡,每個銀行卡可以存入一種幣種的存款,銀行保存賬戶如表3所示:</p><p><b> 銀行卡賬戶信息&
12、lt;/b></p><p> 客戶持銀行卡在ATM機上輸入密碼,經系統(tǒng)驗證身份后辦理存款、取款和轉賬等銀行業(yè)務。銀行規(guī)定,每個賬戶當前的存款金額不得小于1元。</p><p> (4) 銀行卡交易信息</p><p> 銀行在為客戶辦理業(yè)務時,需要記錄每一筆賬目,賬目交易信息如表4所示:</p><p><b> 銀
13、行卡交易信息</b></p><p> 銀行卡手工賬戶和存取款單據信息</p><p> 該銀行要求這套軟件實現銀行客戶的開戶、存款、取款、轉賬和余額查詢等業(yè)務,使得銀行儲蓄業(yè)務方便、快捷,同事保證銀行業(yè)務數據的安全性。</p><p> 為使開發(fā)人員盡快了解銀行業(yè)務,該銀行提供了銀行卡手工賬戶和存取款單據的樣本數據,以供項目開發(fā)時參考,參加表5和
14、表6。</p><p> 銀行卡手工賬戶樣本數據</p><p><b> 存取款單據樣本數據</b></p><p><b> 二、項目實訓內容</b></p><p> 實訓一:制定《數據庫設計與編程規(guī)范》</p><p><b> 長度規(guī)范</
15、b></p><p> 凡是需要命名的對象其標識符均控制在30個字符以內,也即:SQL Server中的表名、字段名、函數名、存儲過程、觸發(fā)器、視圖等名字長度要盡量不超過30個字符長度。</p><p><b> 構成規(guī)范</b></p><p> 數據庫各種名稱必須以字母開頭,但嚴禁以系統(tǒng)關鍵字開頭,名稱只能含有字母、數字以及下劃
16、線“_”三類字符,“_”用于間隔名稱中的各語義字段;不要使用系統(tǒng)保留字作表名。</p><p><b> 大小寫規(guī)范</b></p><p> 構成SQL Server數據庫中的各種名稱(表名、字段名、過程名、視圖名等所有命名符的首字母需要使用大寫,也即每個命名單詞的首字母大寫,其它字符小寫。但對于簡寫或縮寫的短單詞,如ID、UI可以全為大寫。</p>
17、<p><b> 主鍵規(guī)范</b></p><p> 除臨時表、流水表以及日志表外,其它表都要建立主鍵。主鍵最好設計成單一主鍵,盡量不要用復合主鍵,盡量使用沒有業(yè)務語義的字段作為主鍵,</p><p> 如采用按順序自增的數值型字段為主鍵</p><p><b> 注釋規(guī)范</b></p>
18、<p> 每個表,每個字段都要有注釋,說明其含義,對于冗余字段還要特別說明其</p><p> 維護方法,外鍵字段要說明參照于那個表,另外對于存儲過程、視圖、觸發(fā)器、函數等代碼均要增加注釋,以保持代碼的可讀性以及后續(xù)的可維護性。</p><p><b> 行大小規(guī)范 </b></p><p> SQL Server的1頁
19、的大小是8K,因此一行的數據要控制到8K之內,如果超過8K要想辦法將表進行拆分成多個子表。</p><p><b> 數據保留策略</b></p><p> 大表由于數據量較大,往往是系統(tǒng)的性能瓶頸所在,因此對于大表的設計好考慮到今后的數據轉移、分片、Partition等,并且對大表以及其相關表</p><p> 的數據保留時間也要有一個
20、提前規(guī)劃,以免今后出現性能問題束手無策。</p><p><b> 必備字段要求 </b></p><p> 每個大表都應該添加以下幾個有用的字段,分別為創(chuàng)建日期、修改日期、操</p><p> 作人以及版本標記,創(chuàng)建這些字段的目的是為今后的數據轉移以及分片或分</p><p> 區(qū)做準備,同時也有利于今后的數
21、據審計等。</p><p><b> 注意事項 </b></p><p> 基于大表的任何操作都要慎重思考,通常情況下要禁止在大表上創(chuàng)建觸發(fā)器,禁止在大表上做頻繁的批量更新或刪除動作,禁止在生產時間對大表</p><p> 做DDL操作,禁止在大表上做全表掃描(Full Scan)等。</p><p><b&
22、gt; 臨時表功能</b></p><p> SQL Server分為全局臨時表和局部臨時表,臨時表在很多場合下能帶來意想不到的效果,尤其是需要中轉的數據記錄集采用臨時表能提升系統(tǒng)性能。臨時表支持索引、約束、排序等實體表具有的功能。</p><p><b> 存儲特點 </b></p><p> 臨時表的數據存儲在tempd
23、b數據庫中,因此過于頻繁的創(chuàng)建臨時表會增加tempdb庫的負荷,尤其是數據量超過10W條記錄的臨時表更是會影響tempdb庫的性能,由此在某些情況下可用CTE替代臨時表的使用。</p><p><b> 注意事項 </b></p><p> 臨時表執(zhí)行完畢后,要及時的手工Drop掉,及時釋放資源,減輕系統(tǒng)的Loading,另外特別注意的是要盡量禁止使用全局臨時表,
24、全局適合多個session間的數據交互,但往往會引起數據的串值。</p><p><b> 命名規(guī)范</b></p><p> 盡量采用有意義的字段名,使描述盡可能清楚,如采用縮寫,盡量使用通用的縮寫語言,如addr代表address,避免出現只有自己理解的縮寫。</p><p><b> 日期字段 </b><
25、/p><p> 時效性數據應包括“創(chuàng)建時間/修改時間”字段,時間標記對查找數據、清理數據、排序合并特別有用,另外要根據具體業(yè)務考量時間字段的類型,如在Smalldatetime和Datetime類型進行選擇。</p><p><b> 注意保留詞 </b></p><p> 對于字段的命名,要確保字段名沒有和保留詞、數據庫系統(tǒng)或者常用方法沖
26、突,比如master、CROSS、address、substring、len、sysobjects等詞就不適合用來做字段的獨立命名。</p><p><b> 數值規(guī)范</b></p><p> 數值型的主要有INT、BIGINT、TINYINT、SMALLINT、FLOAT、NUMERIC、MONEY等類型,要根據實際應用選擇合適的類型,如字段的數據為小于255
27、的整形數字,那么就要選擇TINYINT;如字段數據小于32767的整形數字,那么就要選擇SMALLINT,以此類推。</p><p><b> 文本規(guī)范</b></p><p> 文本類型主要有CHAR、VARCHAR、TEXT等類型,要根據實際應用選擇合適的類型,如字段文本長度固定為8位,那么就要用CHAR(8);如文本長度最大為100,并且大小是非定長的,那么
28、就要設為VARCHAR(100)。并且以上文本若為漢字,那么就要設為NVARCHAR和NCHAR。</p><p><b> 字段命名技巧 </b></p><p> 字段命名要統(tǒng)一規(guī)范,同一個字段在不同的表中命名要一致,另外字段名一般都要帶上業(yè)務模塊的前綴,如訂單(Order)價格字段命名為Or_Price,部門(Department)編號為Dep_No。命名
29、規(guī)范沒有那個是最合理的,只有定義好最適合自己的統(tǒng)一規(guī)范即可。</p><p><b> 外鍵建立索引</b></p><p> 外鍵不建立索引,將有可能導致兩個嚴重的問題。1.更新相關的表產生死鎖。2.兩表關聯查詢時性能低下。因此通常情況下都必須要求外鍵建立索引。</p><p><b> 聯合索引規(guī)范</b><
30、;/p><p> 當數據對某表經常要多條件查詢時,可能就需要建立聯合索引,聯合索引的第一個引導列字段非常重要,引導列字段通常要能過濾掉大部分數據,這樣方能減少IO的讀寫,提高性能。非引導列字段在引導列的查詢數據基礎上繼續(xù)過濾數據,以提高查詢速度。聯合索引對更新會產生一定的性能影響。</p><p><b> 禁用多余索引</b></p><p>
31、; 數據庫索引能提高查詢速度,但會增加寫操作的開銷,因此對一些幾月或者從沒有使用過的索引要刪除掉,以免增大數據庫的負荷。</p><p><b> 重復索引問題</b></p><p> 一般情況下,盡量避免重復索引的出現,重復索引很容易引起死鎖,減低數據庫的并發(fā)訪問。重復索引也會造成索引的維護困難。</p><p><b>
32、 索引數量限制</b></p><p> 數據庫索引主要用來解決讀的性能瓶頸,但是會增加寫操作的負荷,因此過多的索引會造成更新速度變慢,甚至會引起不要的死鎖。一般情況下表中的索引不要超過5個。</p><p><b> 注意事項</b></p><p> 建立索引前,要充分了解表的使用及數據特性,要了解表的查詢條件和查詢頻率,
33、甚至隨著業(yè)務的變化而引起表數據使用狀況的變化,帶之而來的是索引也需要相應調整。</p><p><b> 命名規(guī)范</b></p><p> 存儲過程命名遵守統(tǒng)一的規(guī)范,對于業(yè)務存儲過程要以p或proc開頭,接著加上”_”,然后再加上模塊名稱簡寫和具體的業(yè)務詞,最后加上執(zhí)行類型。</p><p> 數據庫的存儲過程名嚴禁以sp開頭,sp通
34、常表示系統(tǒng)數據庫存儲過程名的前綴。觸發(fā)器以Tr開頭,接著加上”_”,然后加上表名。</p><p><b> 書寫規(guī)范</b></p><p> 關鍵字建議用大寫,同樣的代碼書寫格式保持一致,SQL腳本采用縮進風格,風格一致,縮進格式一致,使用空格。</p><p><b> INSERT規(guī)范 </b></p&
35、gt;<p> 通常情況下,INSERT語句要給出具體的字段列表,避免采用“INSERT INTO TB_1 VALUES(‘值1’,’值2’,’值3’)”用法,此種用法往往會由于表結構變遷而導致語句不可執(zhí)行</p><p><b> 避免隱式轉換</b></p><p> 書寫時,必須明確表結構及表中各個字段的數據類型,特別是查詢條件中的字段,
36、要避免由于類型的不同導致數據類型轉換的發(fā)生,從而減少因為</p><p> 數據類型轉換產生的系統(tǒng)開銷。</p><p><b> NULL陷阱</b></p><p> NULL不要直接用來進行運算符的比較,也不要和其它值進行連接操作,判斷一個值是否為NULL值時,要采用IS NULL來進行比較。</p><p>
37、;<b> LIKE規(guī)范 </b></p><p> LIKE子句應盡量前段匹配,要避免通配符在前段,以免導致全索引掃描的發(fā)生。</p><p><b> 參數化代碼</b></p><p> SQL中常量的直接使用,會導致SQL語句頻繁的硬解析,進而嚴重影響數據庫的性能,基于這些原因,代碼中要盡量采用參數綁定,以
38、減少語句硬解析的次數,從而提高語句執(zhí)行性能。</p><p><b> 動態(tài) SQL</b></p><p> 動態(tài)SQL是在運行時才進行解析的,相當于是硬解析,因此會損失一些系統(tǒng)性能,但是動態(tài)SQL寫法靈活,因此在某些情況下需要以性能換靈活,但對于用靜態(tài)語句就能簡單實現的SQL,就不要用動態(tài)SQL語句。</p><p><b>
39、 嵌套層級限制 </b></p><p> 嵌套查詢盡量少使用,尤其是對于超過3層的嵌套查詢更要慎用,對于復雜的嵌套語句要根據業(yè)務進行拆分為多條SQL來實現,或者通過臨時表來取代一部分嵌套層級。</p><p><b> 排序規(guī)范</b></p><p> SQL語句中要盡量減少排序,對查詢結果進行的排序會大大降低系統(tǒng)的性能
40、,并且會增加tempdb數據庫的負荷,因此在開發(fā)時間寬松情況下,要盡量將排序動作放到應用程序層去完成。</p><p><b> 代碼注釋要求 </b></p><p> 注釋是指程序中會被編譯器忽略掉的部分,目的是描述代碼的用途及更新時間,合理的添加注釋可以使得程序結構清晰,可以使代碼更好理解,便于系統(tǒng)后續(xù)的維護。一般情況下,注釋要不少于代碼的十分之一。<
41、/p><p><b> 靜態(tài) SQL</b></p><p> SQL語句要盡可能采用靜態(tài)SQL,靜態(tài)SQL第一次執(zhí)行時會將編譯器解析的結果存儲在緩存中,下次執(zhí)行該靜態(tài)SQL時會直接從緩存中獲取其執(zhí)行計劃,相當于是軟解析,因此采用靜態(tài)SQL可以減少語句的解析時間,提升了數據庫的性能。</p><p><b> 最小事務原則</
42、b></p><p> 數據庫事務用來保持數據的一致性,但是對于一個執(zhí)行時間較長的大事務,會造成數據庫鎖的增加,當鎖越積越多的時候就會從行鎖升級到頁鎖,從業(yè)鎖升級到表鎖,從而嚴重影響數據庫的性能。因此,在能滿足數據一致性的前提下,要盡量將非一致性要求的語句代碼從事務中移除,以便提升數據庫的并發(fā)訪問。</p><p><b> 順序提交 </b></p&
43、gt;<p> 順序提交是一個好的代碼編寫習慣,順序提交可以減少死鎖的發(fā)生,并且還能增加代碼的可讀性及可維護性。</p><p> 2、實訓二:數據庫分析設計與建模</p><p> (1) 分析銀行ATM存取款系統(tǒng)實體</p><p> 銀行存取款系統(tǒng)ER圖</p><p><b> 規(guī)范數據庫結構設計&l
44、t;/b></p><p> 第一范式(1NF)是指數據庫表的每一列都是不可分割的基本數據項,同一列中不能有多個值,即實體中的某個屬性不能有多個值或者不能有重復的屬性。</p><p> 如在銀行客戶表BankCustomer中,不能將客戶信息都放在一列中顯示,也不能將其中的兩列或多列在一列中顯示;客戶信息表的每一行只表示一個員工的信息,一個客戶的信息在表中只出現一次。簡而言之,
45、第一范式就是無重復的列。</p><p> 第二范式(2NF)要求實體的屬性完全依賴于主關鍵字。</p><p> 如銀行交易信息表BankDealInfo中,不能把卡號設為主鍵因為一個卡號可以發(fā)生多條交易記錄。要確定唯一的一條信息,必須重新定義一個和其它屬性無關的交易編號。這樣要查詢一條交易信息。就可以用交易編號。簡而言之,第二范式就是屬性完全依賴于主鍵。 </p>&
46、lt;p> 第三范式(3NF)要求一個數據庫表中不包含已在其它表中已包含的非主關鍵字信息。</p><p> 如銀行卡表BankCard中,有了用戶Id后。不能還添加用戶姓名等相關的用戶信息。否則就會有大量的數據冗余。簡而言之,第三范式就是屬性不依賴于其它非主屬性。 </p><p> (3) 繪制CDM模型、生成PDM模型</p><p> 銀行存取
47、款系統(tǒng)數據概念模型CDM</p><p> 銀行存取款系統(tǒng)數據物理模型PDM</p><p> 3、實訓三:創(chuàng)建數據庫</p><p><b> (1) 創(chuàng)建數據庫</b></p><p> 使用Create DataBase語句創(chuàng)建“ATM存取款機系統(tǒng)”數據庫BankDB,數據文件和日志文件保存在指定目錄下文件
48、增長率為15%。</p><p> --創(chuàng)建BankDB數據庫,數據庫文件和日志文件均保存在</p><p> --文件夾d:\sql下</p><p> --文件增長率均為%,數據文件起始大小為MB,日志文件起始大小為MB</p><p> CREATE DATABASE BankDB</p><p> O
49、N PRIMARY</p><p><b> (</b></p><p> NAME=N'BankDB',</p><p> FILENAME=N'd:\sql\BankDB.mdf',</p><p><b> SIZE=5MB,</b></p>
50、<p> FILEGROWTH=15%</p><p><b> )</b></p><p><b> LOG ON </b></p><p><b> (</b></p><p> NAME=N'BankDB_log',</p&g
51、t;<p> FILENAME=N'd:\sql\BankDB_log.ldf',</p><p><b> SIZE=2MB,</b></p><p> FILEGROWTH=15%</p><p><b> )</b></p><p> (2) 創(chuàng)建各個數
52、據表及相關的約束</p><p> 根據銀行業(yè)務,分析表中每個列相應的約束要求,為每個表添加各種約束。要求創(chuàng)建表時要求檢測是否存在表結構,如果存在,則先刪除再創(chuàng)建。</p><p> USE BankDB</p><p><b> GO</b></p><p> --判斷銀行業(yè)務類型是否存在,若存在則刪除<
53、/p><p> --sysobjects系統(tǒng)對象表。保存當前數據庫的對象。</p><p> --OBJECT_ID()根據對象名稱返回該對象的id</p><p> IF EXISTS(SELECT * FROM sysobjects WHERE id=OBJECT_ID(N'BankBusinessType'))</p><
54、p> DROP TABLE BankBusinessType</p><p> --創(chuàng)建銀行業(yè)務類型表</p><p> CREATE TABLE BankBusinessType</p><p><b> (</b></p><p> --銀行業(yè)務類型編號</p><p>
55、 BBTId INT IDENTITY(1,1) PRIMARY KEY,</p><p> --銀行業(yè)務類型名稱</p><p> BBTName CHAR(20) NOT NULL,</p><p><b> --銀行業(yè)務描述</b></p><p> BBTComment VARCHAR(100) <
56、/p><p><b> )</b></p><p><b> GO</b></p><p> --判斷銀行卡客戶是否存在,若存在則刪除</p><p> IF EXISTS (SELECT * FROM sysobjects WHERE id=OBJECT_ID(N'BankCustom
57、er'))</p><p> DROP TABLE BankCustomer</p><p> --創(chuàng)建銀行客戶信息表</p><p> CREATE TABLE BankCustomer</p><p><b> (</b></p><p><b> --客戶編號&l
58、t;/b></p><p> BCId INT IDENTITY(1,1) PRIMARY KEY,</p><p><b> --客戶姓名</b></p><p> BCName CHAR(20) NOT NULL,</p><p> --客戶身份證,定義身份證號前位必須是數字,后位可以是數字或者X。&l
59、t;/p><p> BCICNo CHAR(18) NOT NULL CHECK(LEFT(BCICNo,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]' </p><p> AND (RIGHT(BCICNo,1) LIKE
60、39;[0-9]' OR RIGHT(BCICNo,1) LIKE 'X')),</p><p> --客戶聯系電話,必須是固定電話號碼或者手機號</p><p> BCTel VARCHAR(20) NOT NULL CHECK(BCTel like '[0-9][0-9][0-9][0-9]_[0-9][0-9][0-9][0-9][0-9][0-9
61、][0-9]' or</p><p> BCTel like '[0-9][0-9][0-9]_[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]' or </p><p> BCTel like '1[358][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'),<
62、/p><p><b> --客戶居住地址</b></p><p> BCAddr varchar(100)</p><p><b> )</b></p><p><b> GO</b></p><p> --判斷銀行卡是否存在,若存在。則刪除Ban
63、kCard</p><p> IF EXISTS(SELECT * FROM sysobjects WHERE id=OBJECT_ID(N'BankCard'))</p><p> DROP TABLE BankCard</p><p><b> --建立銀行卡信息</b></p><p> C
64、REATE TABLE BankCard</p><p><b> (</b></p><p><b> --銀行卡號</b></p><p> BCNo CHAR(19) PRIMARY KEY CHECK(BCNo LIKE '1010 3576 [0-9][0-9][0-9][0-9] [0-9][0-
65、9][0-9][0-9]'),</p><p><b> --密碼</b></p><p> BCPwd CHAR(6) NOT NULL DEFAULT('888888'),</p><p><b> --幣種</b></p><p> BCCurrency CHA
66、R(5) NOT NULL DEFAULT('RMB'),</p><p><b> --存款類型</b></p><p> BCBBTId INT NOT NULL,</p><p><b> --開戶日期</b></p><p> BCOpenDate DATE NOT
67、NULL DEFAULT(GETDATE()),</p><p><b> --開戶金額</b></p><p> BCOpenAmount MONEY NOT NULL CHECK(BCOpenAmount>=1),</p><p><b> --是否掛失</b></p><p>
68、BCRegLoss CHAR(2) DEFAULT('否'),</p><p><b> --客戶編號</b></p><p> BCBCId INT NOT NULL,</p><p><b> --余額</b></p><p> BCExistBalance MONEY
69、NOT NULL</p><p><b> )</b></p><p><b> GO</b></p><p> --判斷交易信息BankDealInfo是否存在,若存在則刪除</p><p> IF EXISTS(SELECT * FROM sysobjects WHERE id=OBJE
70、CT_ID(N'BankDealInfo'))</p><p> DROP TABLE BankDealInfo</p><p><b> --創(chuàng)建交易信息表</b></p><p> CREATE TABLE BankDealInfo</p><p><b> (</b>&
71、lt;/p><p><b> --交易編號</b></p><p> BDNo INT IDENTITY(1,1) PRIMARY KEY,</p><p><b> --卡號</b></p><p> BDBCNo CHAR(19) NOT NULL,</p><p>
72、<b> --交易日期</b></p><p> BDDealDate DATE NOT NULL,</p><p><b> --交易金額</b></p><p> BDDealAcount MONEY NOT NULL,</p><p><b> --交易類型</b&g
73、t;</p><p> BDDealType CHAR(10) NOT NULL CHECK(BDDealType='存入' OR BDDealType='支取'),</p><p><b> --交易備注</b></p><p> BDDealComment varchar(100)</p>
74、<p><b> )</b></p><p> (3) 添加外鍵約束和生成數據庫關系圖</p><p> 添加子表外鍵約束及生成數據庫關系圖</p><p> ALTER TABLE BankCard</p><p> ADD CONSTRAINT FK_BC_BBT FOREIGN KEY(BCB
75、BTId) REFERENCES BankBusinessType(BBTId)</p><p> ALTER TABLE BankCard</p><p> ADD CONSTRAINT FK_BC_BC FOREIGN KEY(BCBCId) REFERENCES BankCustomer(BCId)</p><p> ALTER TABLE BankDe
76、alInfo</p><p> ADD CONSTRAINT FK_BDI_BC FOREIGN KEY(BDBCNo) REFERENCES BankCard(BCNo)</p><p> 在SQL SERVER里自動生成數據庫關系圖,如下圖所示:</p><p> BankDb數據庫關系圖</p><p> 4、實訓四:創(chuàng)建觸發(fā)器
77、和插入測試數據</p><p> (1) 創(chuàng)建級聯觸發(fā)器</p><p> 創(chuàng)建Insert觸發(fā)器</p><p> 在交易信息表創(chuàng)建一個Insert觸發(fā)器,當增加一條交易信息時,修改相應銀行卡的存款余額。</p><p> --在交易信息表插入觸發(fā)器.使用游標當新增一個交易信息.修改銀行卡的存款余額</p><p
78、> --檢查觸發(fā)器是否存在.存在則刪除</p><p> IF(OBJECT_ID('tr_InsertDealInfo','TR') IS NOT null)</p><p> DROP TRIGGER tr_InsertDealInfo</p><p><b> GO</b></p>
79、<p> --創(chuàng)建Insert觸發(fā)器</p><p> CREATE TRIGGER tr_InsertDealInfo ON BankDealInfo FOR INSERT</p><p><b> AS</b></p><p> DECLARE @type CHAR(10),@sum MONEY,@BDBCNo CHA
80、R(19)</p><p> --定義游標,指向inserted表</p><p> DECLARE cursor_BankDealInfo CURSOR FOR </p><p> SELECT BDDealType,BDDealAcount,BDBCNo FROM Inserted</p><p><b> --打開游標
81、</b></p><p> OPEN cursor_BankDealInfo</p><p> --讀取游標.賦值給相應字段</p><p> FETCH NEXT FROM cursor_BankDealInfo INTO @type,@sum,@BDBCNo</p><p> --@@FETCH_STATUS=0 FE
82、TCH 語句成功</p><p> WHILE @@FETCH_STATUS=0</p><p><b> BEGIN</b></p><p> --根據交易類型.更新銀行卡余額.RTRIM和LRAIM是去除首尾空格</p><p> IF(RTRIM(LTRIM(@type))='存入')<
83、;/p><p> UPDATE BankCard SET BCExistBalance=BCExistBalance+@sum WHERE BCNo=@BDBCNo</p><p> IF(RTRIM(LTRIM(@type))='支取')</p><p> UPDATE BankCard SET BCExistBalance=BCExistBal
84、ance-@sum WHERE BCNo=@BDBCNoFETCH NEXT FROM cursor_BankDealInfo INTO @type,@sum,@BDBCNo</p><p><b> END</b></p><p><b> --關閉游標</b></p><p> CLOSE cursor_Ban
85、kDealInfo</p><p><b> --釋放游標</b></p><p> DEALLOCATE cursor_BankDealInfo</p><p><b> GO</b></p><p> 創(chuàng)建Delete觸發(fā)器</p><p> 在交易信息表創(chuàng)建一
86、個Delete觸發(fā)器,當刪除一條交易信息時,修改相應銀行卡的存款余額。</p><p><b> --刪除</b></p><p> --觸發(fā)器存在則刪除</p><p> IF(OBJECT_ID('tr_DelDealInfo','TR') IS NOT NULL)</p><p&g
87、t; DROP TRIGGER tr_DelDealInfo</p><p><b> GO</b></p><p> --創(chuàng)建delete觸發(fā)器</p><p> CREATE TRIGGER tr_DelDealInfo ON BankDealInfo FOR DELETE</p><p><b>
88、 AS</b></p><p> DECLARE @type CHAR(10),@sum MONEY,@BDBCNo CHAR(19)</p><p> --定義游標,指向deleted表</p><p> DECLARE cursor_BankDealInfo CURSOR FOR </p><p> SELECT B
89、DDealType,BDDealAcount,BDBCNo FROM Deleted</p><p><b> --打開游標</b></p><p> OPEN cursor_BankDealInfo</p><p><b> --讀取游標,賦值</b></p><p> FETCH NEX
90、T FROM cursor_BankDealInfo INTO @type,@sum,@BDBCNo</p><p> WHILE @@FETCH_STATUS=0</p><p><b> BEGIN</b></p><p> IF(RTRIM(LTRIM(@type))='存入')</p><p&g
91、t; UPDATE BankCard SET BCExistBalance=BCExistBalance-@sum WHERE BCNo=@BDBCNo</p><p> IF(RTRIM(LTRIM(@type))='支取')</p><p> UPDATE BankCard SET BCExistBalance=BCExistBalance+@sum WHERE
92、BCNo=@BDBCNo</p><p> FETCH NEXT FROM cursor_BankDealInfo INTO @type,@sum,@BDBCNo</p><p><b> END</b></p><p> CLOSE cursor_BankDealInfo</p><p> DEALLOCATE
93、 cursor_BankDealInfo</p><p><b> GO</b></p><p> 創(chuàng)建Update觸發(fā)器</p><p> 在交易信息表創(chuàng)建一個Update觸發(fā)器,當更新一條交易信息時,修改相應銀行卡的存款余額。</p><p><b> --更新</b></p>
94、;<p> --觸發(fā)器存在則刪除</p><p> IF(OBJECT_ID('tr_UpdateDealInfo','TR') IS NOT NULL)</p><p> DROP TRIGGER tr_UpdateDealInfo</p><p><b> GO</b></p>
95、;<p> CREATE TRIGGER tr_UpdateDealInfo ON BankDealInfo FOR UPDATE</p><p><b> AS</b></p><p> DECLARE @type CHAR(10),@sum MONEY,@BDBCNo CHAR(19)</p><p> --定義游標,
96、指向deleted表</p><p> DECLARE cursor_BankDealInfo CURSOR FOR </p><p> SELECT BDDealType,BDDealAcount,BDBCNo FROM Deleted</p><p><b> --打開游標</b></p><p> OPEN
97、 cursor_BankDealInfo</p><p><b> --讀取游標,賦值</b></p><p> FETCH NEXT FROM cursor_BankDealInfo INTO @type,@sum,@BDBCNo</p><p> WHILE @@FETCH_STATUS=0</p><p>&
98、lt;b> BEGIN</b></p><p> IF(RTRIM(LTRIM(@type))='存入')</p><p> UPDATE BankCard SET BCExistBalance=BCExistBalance-@sum WHERE BCNo=@BDBCNo</p><p> IF(RTRIM(LTRIM(@t
99、ype))='支取')</p><p> UPDATE BankCard SET BCExistBalance=BCExistBalance+@sum WHERE BCNo=@BDBCNo</p><p> FETCH NEXT FROM cursor_BankDealInfo INTO @type,@sum,@BDBCNo</p><p>&l
100、t;b> END</b></p><p> CLOSE cursor_BankDealInfo</p><p> DEALLOCATE cursor_BankDealInfo</p><p> --定義游標,指向inserted表</p><p> DECLARE cursor_BankDealInfo CURSO
101、R FOR </p><p> SELECT BDDealType,BDDealAcount,BDBCNo FROM Inserted</p><p><b> --打開游標</b></p><p> OPEN cursor_BankDealInfo</p><p> --讀取游標.賦值給相應字段</p&g
102、t;<p> FETCH NEXT FROM cursor_BankDealInfo INTO @type,@sum,@BDBCNo</p><p> --@@FETCH_STATUS=0 FETCH 語句成功</p><p> WHILE @@FETCH_STATUS=0</p><p><b> BEGIN</b>&l
103、t;/p><p> --根據交易類型.更新銀行卡余額.RTRIM和LRAIM是去除首尾空格</p><p> IF(RTRIM(LTRIM(@type))='存入')</p><p> UPDATE BankCard SET BCExistBalance=BCExistBalance+@sum WHERE BCNo=@BDBCNo</p>
104、;<p> IF(RTRIM(LTRIM(@type))='支取')</p><p> UPDATE BankCard SET BCExistBalance=BCExistBalance-@sum WHERE BCNo=@BDBCNoFETCH NEXT FROM cursor_BankDealInfo INTO @type,@sum,@BDBCNo</p>&l
105、t;p><b> END</b></p><p><b> --關閉游標</b></p><p> CLOSE cursor_BankDealInfo</p><p><b> --釋放游標</b></p><p> DEALLOCATE cursor_Bank
106、DealInfo</p><p> 插入數據表的測試數據</p><p> 使用T-SQL語句向每個表插入如下所示測試數據,要保證業(yè)務數據的一致性和完整性。</p><p> BankBusinessType表的測試數據</p><p> INSERT INTO BankBusinessType</p><p>
107、; (BBTName,BBTComment)</p><p> VALUES('活期','無固定存期,可隨時存取,存取金額不限的一種比較靈活的存款'),</p><p> ('定活兩便','事先不約定存定期,一次性存入,一次性支取的存款'),</p><p> ('通知',
108、39;不約定存期,支取是需提前通知銀行,約定支取日期和金額方能支取的存款'),</p><p> ('整存整取年','整筆存入,到期提取本息'),</p><p> ('整存整取年','整筆存入,到期提取本息'),</p><p> ('整存整取年','整筆存入,到
109、期提取本息'),</p><p> ('零存整取年','事先原定金額,逐月按約定金額存入,到期支付本息'),</p><p> ('零存整取年','事先原定金額,逐月按約定金額存入,到期支付本息'),</p><p> ('零存整取年','事先原定金額,逐月按約定金
110、額存入,到期支付本息'),</p><p> ('自助轉賬','銀行ATM存取款機上辦理銀行卡之間互相劃轉')</p><p><b> GO</b></p><p> SELECT * FROM BankBusinessType</p><p> BankBusiness
111、Type表測試數據</p><p> BankCustomer表的測試數據</p><p> INSERT INTO BankCustomer</p><p> (BCName,BCICNo,BCTel,BCAddr)</p><p> VALUES ('葉春萌','152825198512548541
112、9;,'13585941287','麗都新城'),</p><p> ('周明','152821198401248574','0147-7418527','松石名第')</p><p><b> GO</b></p><p> SELECT *
113、 FROM BankCustomer</p><p> BankCustomer表測試數據</p><p> BankCard表的測試數據</p><p> INSERT INTO BankCard (BCNo,BCPwd,BCCurrency,BCBBTId,BCOpenDate,BCOpenAmount,BCRegLoss,BCBCId,BC
114、ExistBalance)</p><p> VALUES ('1010 3576 1234 5678','197611','RMB',1,CAST(DATEADD(DAY,-(RAND()*30),GETDATE()) AS date),1000,'否',1,1000),</p><p> ('1010 357
115、6 1234 5688','197611','RMB',2,CAST(DATEADD(DAY,-(RAND()*30),GETDATE()) AS date),1000,'否',2,1500)</p><p><b> GO</b></p><p> SELECT * FROM BankCard</p&
116、gt;<p> BankCard表測試數據</p><p> BankDealInfo表的測試數據</p><p> INSERT INTO BankDealInfo</p><p> (BDBCNo,BDDealDate,BDDealAcount,BDDealType,BDDealComment)</p><p>
117、VALUES ('1010 3576 1234 5678',CAST(DATEADD(DAY,-(RAND()*15),GETDATE()) AS date),500,'存入','單位月工資'),</p><p> ('1010 3576 1234 5678',CAST(DATEADD(DAY,-(RAND()*15),GETDATE()) AS
118、 date),1500,'存入','單位月工資'),</p><p> ('1010 3576 1234 5678',CAST(DATEADD(DAY,-(RAND()*15),GETDATE()) AS date),300,'存入','支付寶付款'),</p><p> ('1010 3576 1
119、234 5678',CAST(DATEADD(DAY,-(RAND()*15),GETDATE()) AS date),400,'支取','刷卡消費'),</p><p> ('1010 3576 1234 5688',CAST(DATEADD(DAY,-(RAND()*15),GETDATE()) AS date),3500,'存入',
120、'單位月工資'),</p><p> ('1010 3576 1234 5688',CAST(DATEADD(DAY,-(RAND()*15),GETDATE()) AS date),4500,'存入','單位月工資'),</p><p> ('1010 3576 1234 5688',CAST(DATE
121、ADD(DAY,-(RAND()*15),GETDATE()) AS date),800,'存入','支付寶付款'),</p><p> ('1010 3576 1234 5688',CAST(DATEADD(DAY,-(RAND()*15),GETDATE()) AS date),900,'支取','刷卡消費')</p&g
122、t;<p><b> GO</b></p><p> SELECT * FROM BankDealInfo</p><p> BankDealInfo表測試數據</p><p> 5、實訓五:模擬常規(guī)業(yè)務</p><p> (1) 修改客戶密碼</p><p> 根據卡號
123、修改指定2個客戶的銀行密碼,其中第一個客戶1010 3576 1234 5678密碼修改為123456,第二個客戶1010 3576 1234 5688修改為123123。</p><p> --(1)修改客戶密碼</p><p> UPDATE BankCard SET BCPwd='123465' WHERE BCNo='1010 3576 1234 567
124、8'</p><p> UPDATE BankCard SET BCPwd='123123' WHERE BCNo='1010 3576 1234 5688'</p><p> SELECT BCNo '銀行卡卡號',BCPwd '密碼',BCCurrency '貨幣類型',BCBBTId '
125、;儲蓄種類',BCOpenDate '開戶日期',BCOpenAmount '開戶金額', BCRegLoss '是否掛失',BCBCId'客戶編號',BCExistBalance '存款金額' FROM BankCard</p><p><b> 修改客戶密碼效果圖</b></p>&l
126、t;p><b> 辦理銀行卡掛失</b></p><p> 卡號為1010 3576 1234 5678的銀行卡丟失,申請掛失。</p><p> --(2)辦理銀行卡掛失</p><p> UPDATE BankCard SET BCRegLoss='是' WHERE BCNo='1010 3576 12
127、34 5678'</p><p> SELECT BCNo '銀行卡卡號',BCPwd '密碼',BCCurrency '貨幣類型',BBTName '儲蓄類型',BCOpenDate '開戶日期',BCOpenAmount '開戶金額', BCRegLoss '是否掛失',BCName
128、9;客戶姓名',BCExistBalance '存款金額' FROM BankCard </p><p> INNER JOIN BankCustomer ON BankCard.BCBCId=BankCustomer.BCId</p><p> INNER JOIN BankBusinessType ON BankCard.BCBBTId=BankBusine
129、ssType.BBTId</p><p> 辦理銀行卡掛失效果圖</p><p> 統(tǒng)計銀行資金流通余額和盈利結算</p><p> 存入代表資金流入,支取代表資金流出。</p><p> 計算公式:資金流通余額=總存入金額-總支取金額</p><p> 假定存款利率為千分之三,貸款利率為千分之八。</
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 銀行自動存取款機(atm機)怎樣存錢
- java課程設計報告--atm存取款系統(tǒng)
- 銀行atm自動取款機系統(tǒng)課程設計
- atm自動存取款機服務指南
- 銀行atm自動取款機系統(tǒng)課程設計
- c_課程設計—自動存取款機軟件設計
- vb課程設計--銀行存取款管理系統(tǒng)
- java課程設計銀行存取款管理系統(tǒng)
- 銀行存取款業(yè)務受理課程設計
- vb課程設計--銀行存取款管理
- 銀行存取款管理課程設計
- 課程設計報告--atm取款機程序
- 信息管理與信息系統(tǒng)課程設計--銀行atm機存取款系統(tǒng)分析與設計
- c語言課程設計--銀行存取款業(yè)務
- 銀行存取款管理系統(tǒng)設計
- c語言課程設計銀行存取款業(yè)務8
- c語言課程設計報告(銀行存取款管理設計)
- c語言課程設計---模擬銀行存取款業(yè)務
- c++課程設計---建行atm取款機管理系統(tǒng)
- atm自動取款機系統(tǒng)設計
評論
0/150
提交評論