出版時間:2008-9 出版社:清華大學出版社 作者:(美) (克羅恩克Kroenke) (D.M.) (美) ( 頁數(shù):437
前言
Colin Johnson是西雅圖一家小型制造廠的產品管理員。幾年前,Colin計劃構建一個數(shù)據(jù)庫來跟蹤產品包中的產品。開始時,他運用電子制表軟件來完成這一工作,卻無法通過該表獲取所需的報表。Colin聽說了Microsoft Access,希望該軟件能解決問題。經過幾天的嘗試,他發(fā)現(xiàn)無法掌握Access的使用方法,于是購買了一些流行的Access書籍并努力學習。不過最終他還是放棄了,后來他聘請了一個顧問,該顧問創(chuàng)建了一個大致可滿足Colin要求的應用程序。一段時間以后,Colin想對此應用程序作一些改動,但他卻不敢進行這樣的嘗試?! olin是個成功的商人,他能夠主動地去實現(xiàn)他的目標。作為一個老練的Windows用戶,他可以通過自學掌握Excel、PowerPoint以及大量面向產品的應用程序。但他在使用Access來解決問題時卻停滯不前。Colin認為“我確信我可以做到,但我沒有更多的時間”。這樣的事件非常引人注目,因為在過去的10年內上演了無數(shù)次?! icrosoft Corporation、Oracle和其他數(shù)據(jù)庫管理系統(tǒng)(DBMS)廠商都意識到了這一情況,他們投入了數(shù)百萬美元來創(chuàng)建更好的圖形用戶界面、數(shù)以百計的多窗格向導,以及眾多示例應用程序。遺憾的是,這樣的努力無法從根本上解決問題。事實上,許多用戶并不清楚向導可以實現(xiàn)哪些功能。一旦這些用戶需要修改數(shù)據(jù)結構或是組件(例如,窗體和查詢),就會陷入麻煩中,這令他們措手不及。如果不了解底層結構,這些用戶就只能絞盡腦汁,卻徒勞無功。最終也只能得到一些設計糟糕的數(shù)據(jù)庫和應用程序,而無法滿足用戶的要求。 那么為什么像Colin這樣的用戶可以學會使用文字處理軟件或電子數(shù)據(jù)表這樣的產品,卻無法學會使用DBMS產品呢?其中一個主要原因就是許多人都不熟悉數(shù)據(jù)庫的基本概念。每個人可能都知道段落和邊距,卻無法理解關系的概念。其次,他們可能覺得使用DBMS產品一定比了解數(shù)據(jù)庫概念本身更容易?!拔覀兿胱龅闹皇歉櫼恍﹥热?,為什么實現(xiàn)起來卻這么困難?”如果不了解關系模型,在存儲數(shù)據(jù)之前將一張銷售發(fā)票分成5個單獨的表就可能使業(yè)務用戶感到迷惑?! 』靖拍睢 ‘斀竦募夹g特點是如果不學習基本概念,那么就不可能成功地利用DBMS。憑借多年來為業(yè)務用戶開發(fā)數(shù)據(jù)庫的經驗,我認為數(shù)據(jù)庫的基本概念主要包括以下內容: ● 關系模型的基本概念 ● 結構化查詢語言(SQL) ● 數(shù)據(jù)建?! ?數(shù)據(jù)庫設計 ● 數(shù)據(jù)庫管理 由于當前Internet和World Wide Web的廣泛使用,因此可以增加一個更為基本的概念: ● Web數(shù)據(jù)庫處理 像Colin這樣的用戶(或是將接受類似工作的學生)不需要像信息系統(tǒng)專家那樣深入地了解這些主題。因此,《數(shù)據(jù)庫原理》只介紹了一些基本的概念——這些內容對于像Colin這樣的用戶(創(chuàng)建和使用小型數(shù)據(jù)庫的用戶)來說至關重要。我已經在Database Processing: Fundamentals, Designs, and Implementation一書中重寫、簡化和刪除了一些內容1。 不過在《數(shù)據(jù)庫原理》中,也力求討論準確,不會產生誤導。即使學生們已學習過更高級的數(shù)據(jù)庫課程,也仍然可從《數(shù)據(jù)庫原理》中獲益?! —毩⒂贒BMS產品的概念 《數(shù)據(jù)庫原理》假設學生沒有使用過任何特定的DBMS產品。《數(shù)據(jù)庫原理》通過Microsoft Access、SQL Server 2005 Express Edition和MySQL 5.0舉例說明了數(shù)據(jù)庫概念,從而使學生可以將這些產品作為工具使用,并且實際地嘗試練習書中的內容,但是,所有的概念都適合于DBMS產品。通過這種方式,學生們可以理解所有數(shù)據(jù)庫的基礎知識—— 從小型的Access數(shù)據(jù)庫到大型的Oracle或DB2數(shù)據(jù)庫?! 《疫@一方法也避免了一個常見的問題。在同時介紹概念和產品時,學生容易將概念與產品特性、功能相混淆。例如參照完整性約束。在講授基礎理論時,學生都知道在某些情況下,一個表中的列值必須總是由另一個表中的列值提供。學生也將知道這一約束如何出現(xiàn)在關系定義的上下文中,以及DBMS或應用程序如何強制執(zhí)行這一約束。如果結合具體的DBMS教學,如Access,那么學生將學到的知識就可能是:在某些情況下選取復選框,而在其他情況下不選取的具體操作。這樣很容易導致在介紹產品特性的同時,使學生們淡忘了數(shù)據(jù)庫的基本理論?! ∪欢@并不是說在《數(shù)據(jù)庫原理》中將不使用DBMS。相反,學生們可以通過使用企業(yè)版DBMS產品來熟悉這些基本概念?!稊?shù)據(jù)庫原理》的這一版本包括了關于Access、SQL Server 2005 Express Edition和MySQL 5.0的充分的基本信息,從而使您可以在不借助其他書籍或資料的情況在課堂上介紹這些產品?!稊?shù)據(jù)庫原理》深入介紹了Access,因為它是在個人數(shù)據(jù)庫方面非常流行的產品(并且包括在Microsoft Office Professional應用程序套件中)。通過學習這些Access相關知識,學生可以完成書中介紹的所有數(shù)據(jù)庫任務,并且可能勝任一些課程的學習。然而,如果希望深入介紹特定的DBMS或使用《數(shù)據(jù)庫原理》中沒有介紹的DBMS產品,則需要提供額外的書籍或資料。Prentice-Hall提供了有關Microsoft Access 2003和其他DBMS產品的大量輔助讀物,可以結合《數(shù)據(jù)庫原理》一起學習。 Access工作臺 《數(shù)據(jù)庫原理》前面的版本在附錄中介紹了Access。Access廣泛用于初級數(shù)據(jù)庫課程,因此這一版本介紹了如何使用Access的更多信息。每一章都帶有一個“Access工作臺”部分,其中使用Access舉例說明了本章的概念和技術?!癆ccess工作臺”的第一部分介紹了如何創(chuàng)建數(shù)據(jù)庫和簡單的表,到最后的第七部分則介紹了針對Access數(shù)據(jù)庫的Web數(shù)據(jù)庫處理。“Access工作臺”的作用不是全面地介紹Access,而是介紹包括了所有必要的基礎Access主題,從而使學生可以有效地構建并使用Access數(shù)據(jù)庫。 復習題、練習題和實踐項目 學生能否學會最終運用所學的知識非常重要,因此每章都提供了一些復習題、練習題(包括針對“Access工作臺”的練習題)和3個貫穿《數(shù)據(jù)庫原理》始終的項目。如果學生閱讀并理解了每一章的內容,就應該能知道復習題的答案。練習題要求學生將每章所講的概念應用到具體的小問題或任務中?! 〉谝粋€項目Garden Glory介紹了一個向個人或企業(yè)提供園藝服務的合伙公司的數(shù)據(jù)庫,并討論了該數(shù)據(jù)庫的開發(fā)和使用。第二個項目James River珠寶行分析了一家零售店為支持針對的購買者而設計的程序的數(shù)據(jù)庫需求。第三個項目Queen Anne Curiosity商店介紹了零售商店的銷售和庫存需求。《數(shù)據(jù)庫原理》的所有章節(jié)和附錄C中都包括了這3個項目。在每個實例中,都要求學生將各章中學到的知識運用到項目中去。教師們可以填寫《數(shù)據(jù)庫原理》最后的調查表向培生出版集團駐北京代表處領取教學支持資料,其中包括與《數(shù)據(jù)庫原理》相關的一些數(shù)據(jù)庫和示例數(shù)據(jù)。在過去30多年中,我們已經發(fā)現(xiàn)數(shù)據(jù)庫和數(shù)據(jù)庫應用程序的開發(fā)是一項令人愉快和有益的活動。我們相信:數(shù)據(jù)庫的數(shù)量、大小和重要性會在將來不斷增加,并且該領域將越來越顯示其突出的地位。我們希望《數(shù)據(jù)庫原理》中介紹的概念、知識和技術將幫助學生成功地參與到現(xiàn)在和多年以后的數(shù)據(jù)庫項目構建中?! Φ?版的改進 主要的改動如下: ● 介紹了SQL視圖(附錄C)。 ● 介紹了子類型/子類型實體(第4章和第5章)?! ?使用了IE Crow’s Foot E-R圖而不是UML E-R模型以方便用戶使用,并且與Database Processing的第10版保持一致(第4章和后面的章節(jié))。 ● 重新安排了第6章和第7章中的主題——在第6章中作為數(shù)據(jù)庫管理的一部分介紹了分布式數(shù)據(jù)庫和面向對象的數(shù)據(jù)庫?! ?附帶介紹了基于Web的數(shù)據(jù)庫處理,包括創(chuàng)建Web頁面的特定步驟和代碼示例,這些Web頁面顯示存儲在數(shù)據(jù)庫中的數(shù)據(jù)(第7章)?! ?介紹了商業(yè)智能(BI)系統(tǒng)的概念(第7章)?! ?在每章和附錄C中使用“Access工作臺”介紹Access的基礎知識?! ?介紹SQL Server 2005 Express Edition(附錄A)和MySQL 5.0(附錄B)的使用?! 〈送猓褂檬纠龜?shù)據(jù)集充分地開發(fā)了在《數(shù)據(jù)庫原理》各個部分中使用的3個示例數(shù)據(jù)庫——在每一章中使用的Wedgewood Pacific Corporation和Heather Sweeney Designs,以及在“Access工作臺”中使用的Wallingford Motors。這些數(shù)據(jù)庫的使用提供了全書各個章節(jié)之間概念示例的連續(xù)性,并且使學生可以創(chuàng)建實際的數(shù)據(jù)庫以試驗每章中討論的主題?! 〈送猓€有一個沒有改動的方面需要提及,即這一版中保留了第2版中增加的較為有效的規(guī)范化討論,并且使用說明性的過程來規(guī)范化關系?!稊?shù)據(jù)庫原理》的第1版介紹了規(guī)范化的基本原理,讓學生自己應用這些基本原理。第2版的第2章介紹了學生可以用于運用規(guī)范化的4步過程。這一改動不僅簡化了規(guī)范化任務,而且使規(guī)范化的基本原理更加易于理解。因此,當前版本中沿用了這一方法。對于需要深入了解范式的教師,《數(shù)據(jù)庫原理》第5章中在討論范式時介紹了2NF和3NF的簡短定義?! ≈饕獌热荨 稊?shù)據(jù)庫原理》共包括7章和3個附錄。第1章解釋了使用數(shù)據(jù)庫的原因、數(shù)據(jù)庫的組成以及開發(fā)數(shù)據(jù)庫的方法。學生們將學習數(shù)據(jù)庫及其應用程序的用途、數(shù)據(jù)庫相對于電子表格列表的差別和優(yōu)勢。第2章介紹了關系模型,定義了基本的關系模型術語,同時還介紹了規(guī)范化原則的基本概念,并介紹了規(guī)范化過程。 第3章講述了基本的SQL語句。介紹了定義數(shù)據(jù)的基本SQL語句,如SQL SELECT和數(shù)據(jù)修改語句?!稊?shù)據(jù)庫原理》并不介紹高級的SQL語句,只講述一些核心的語句。附錄C介紹了SQL視圖。接下來的3章討論了數(shù)據(jù)庫設計和管理。第4章使用實體-關系(E-R)模型解決數(shù)據(jù)建模問題,其中包括對數(shù)據(jù)建模的需求、基本的E-R術語和概念,還提供了一個簡短的E-R建模示例應用程序(Heather Sweeney Designs)。第5章講述了數(shù)據(jù)庫設計,解釋了規(guī)范化的基本概念。第4章示例中的數(shù)據(jù)模型在第5章中則被轉換為關系設計?! 〉?章討論了數(shù)據(jù)庫管理。構建了一個作為功能數(shù)據(jù)庫的示例數(shù)據(jù)庫,并且將其用作討論數(shù)據(jù)庫管理需求的示例。本章概述了并發(fā)控制、安全性和備份及恢復技術。數(shù)據(jù)庫管理主題對所有的數(shù)據(jù)庫都很重要,對個人的單用戶數(shù)據(jù)庫也是如此。事實上,這些主題在某些方面對于私人數(shù)據(jù)庫更為重要,因為它們沒有專業(yè)的數(shù)據(jù)庫管理員來確保關鍵任務的執(zhí)行。第6章也討論了分布式數(shù)據(jù)庫和面向對象的數(shù)據(jù)庫?! ∽詈?,第7章介紹了使用基于Web的數(shù)據(jù)庫處理,包括開放數(shù)據(jù)庫連接(ODBC)、活動數(shù)據(jù)對象(ADO)、活動服務器頁面(ASP)的討論。本章也討論了可擴展標記語言(XML)的出現(xiàn)和基本概念,并且介紹了商業(yè)智能(BI)系統(tǒng)?! 「戒汚提供了SQL Server 2005 Express Edition的簡短介紹,附錄B則提供了MySQL 5.0的類似介紹。在每章和附錄C的“Access工作臺”中都包括了對Microsoft Access的介紹。
內容概要
本書是數(shù)據(jù)庫初學者和初級開發(fā)人員不可多得的數(shù)據(jù)庫寶典,其中融入了作者對數(shù)據(jù)庫深入透徹的理解和豐富的實際操作經驗。與第2版一樣,本版也深入淺出地描繪了數(shù)據(jù)庫原理及其應用。但本版技術更新、實用性更強,新增的內容包括子類型/子類型實體、IE Crows Foot E-R圖、基于Wed的數(shù)據(jù)庫處理、商業(yè)智能系統(tǒng)、SQL視圖、SQL Server 2005 Express Edition和 My SQL 5.0的使用等?! 薪榻B了在成功管理數(shù)據(jù)庫系統(tǒng)的基本概念,包括: ·關系模型的基本原理 ·結構化查詢語言(SQL) ·數(shù)據(jù)建模 ·數(shù)據(jù)庫設計 ·數(shù)據(jù)庫管理 ·Web數(shù)據(jù)庫處理
作者簡介
David M.Kroenke,在1967年作為Rand Corporation公司的實習生時進入了計算行業(yè),在此之后,他的職業(yè)生涯涉及教育、工業(yè)、顧問和出版等領域?! roenke曾經在科羅拉多州立大學、西雅圖大學教學,目前在華盛頓大學教學。在多年的教學生涯中,他組織了數(shù)十次由大學教授參加的教學研討會。在1991年,International Association ofInformation System授予他“年度計算機教育家”的榮譽稱號。 在工業(yè)方面,Kroenke曾經為美國空軍和波音計算機服務工作,并且負責創(chuàng)立了個公司。他也曾經是Microrim公司負責產品銷售和開發(fā)的副主席,并且是Wall Data公司在數(shù)據(jù)庫劃分方面的首席技術專家。Kroenke是語義對象數(shù)據(jù)模型的創(chuàng)始者,他所擁有的咨詢客戶包括mM公司、Microsoft、Computer Sciences公司,以及許多其他的公司和組織。 Kroenke的著作Database Processing最初出版于1977年,現(xiàn)在已經是第10版。 Kroenke也出版了其他許多書籍,包括經典的Business Compu~~r Systems(198i)。他最近編寫的書籍是UsingMIS的第1版。出于對成為海員的渴望,Kroenke也編寫了KnowYour Boat:The Guide tOEverything ThatMakes YourBoat Work。Kroenke現(xiàn)居住在華盛頓州的西雅圖市,他結過婚,有兩個孩子和兩個外孫?! avid J.Auer目前是西華盛頓大學的College of Business and Economics(CBE)信息系統(tǒng)和技術服務的主管,并且是CBE的決策科學部門的講師。他從1981年開始在CBE中任教,教授的課程包括Quantitative Methods、Production and Operations Management、Statistics、Finance and Management Information Systems。在1994年,他受雇于目前的CBE職位。除了管理CBE的計算機、網絡和其他技術資源之外,他還教授Management Information System課程。Auer負責教授Principles ofManagement Information Systems and Business Database Development課程,并且負責拓展CBE的網絡基礎結構課程,包括計算機硬件和操作系統(tǒng)、遠程通信和網絡管理。Auer已經和其他人合作編寫了一些與MIS相關的書籍?! uer在華盛頓大學獲得了英語文學學士學位,在西華盛頓大學獲得了數(shù)學和經濟學學士學位,并且在西華盛頓大學獲得經濟學碩士學位和輔導心理學碩士學位。Auer是美國空軍軍官,他還作為組織開發(fā)專家和治療專家為Employee Assistance Program(EAP)工作。Auer和妻子Donna居住在華盛頓州的貝靈漢市,他是當?shù)赜媱澪瘑T會(Planning Commission)的成員,并且積極參與社團成長和發(fā)展的相關問題。他有兩個孩子和3個外孫。~
書籍目錄
第Ⅰ部分 基礎知識第1章 數(shù)據(jù)庫簡介31.1 使用數(shù)據(jù)庫的原因41.1.1 關于列表的問題41.1.2 使用關系數(shù)據(jù)庫71.1.3 關系表的處理131.2 數(shù)據(jù)庫系統(tǒng)的概念141.2.1 數(shù)據(jù)庫151.2.2 DBMS161.2.3 應用程序181.2.4 個人數(shù)據(jù)庫系統(tǒng)和企業(yè)數(shù)據(jù)庫系統(tǒng)的比較201.3 Access工作臺:第1部分——熟悉Microsoft Access221.3.1 創(chuàng)建Access數(shù)據(jù)庫231.3.2 創(chuàng)建數(shù)據(jù)庫表261.3.3 在表中插入數(shù)據(jù)——數(shù)據(jù)表視圖341.3.4 修改表中的數(shù)據(jù)——數(shù)據(jù)表視圖371.3.5 刪除表中的行——數(shù)據(jù)表視圖381.3.6 在表中插入數(shù)據(jù)——使用表單401.3.7 修改數(shù)據(jù)和刪除記錄——使用表單441.3.8 創(chuàng)建一個表的Access報表441.3.9 關閉數(shù)據(jù)庫并退出Access471.4 小結481.5 復習題491.6 練習題501.7 Access工作臺練習題511.8 Garden Glory項目問題521.9 James River珠寶行項目問題521.10 Queen Anne Curiosity商店項目問題53第2章 關系模型552.1 關系562.1.1 一個關系示例與兩個非關系示例572.1.2 顯示關系結構的說明582.1.3 術語說明592.2 鍵的類型592.2.1 復合鍵602.2.2 候選鍵與主鍵602.2.3 代理鍵632.2.4 外鍵與參照完整性約束642.3 NULL值的問題682.4 函數(shù)依賴與規(guī)范化682.4.1 函數(shù)依賴692.4.2 再論主鍵與候選鍵702.4.3 規(guī)范化712.4.4 關系設計原則722.4.5 規(guī)范化過程722.4.6 規(guī)范化的示例742.5 Access工作臺:第二部分——在Microsoft Access中操作多個表792.5.1 WMCRM數(shù)據(jù)庫中可能的修改問題802.5.2 操作多個表842.5.3 創(chuàng)建表之間的關系862.5.4 使用包括兩個表的表單902.5.5 創(chuàng)建包括兩個表中數(shù)據(jù)的報表912.5.6 關閉數(shù)據(jù)庫并退出Access922.6 小結932.7 復習題942.8 練習題952.9 Access工作臺練習題962.10 Garden Glory項目問題992.11 James River Jewelry珠寶行項目問題1002.12 Queen Anne Curiosity商店項目問題101第3章 結構化查詢語言1053.1 示例數(shù)據(jù)庫1063.2 用于數(shù)據(jù)定義的SQL語句1103.2.1 使用表約束定義主鍵1153.2.2 使用表約束定義外鍵1163.2.3 向DBMS提交SQL語句1183.3 插入關系數(shù)據(jù)的SQL語句1213.4 SQL關系查詢語句1243.4.1 SQL SELECT/FROM/WHERE架構1243.4.2 從單個表中讀取指定列1253.4.3 從單個表中讀取指定行1273.4.4 從單個表中讀取指定行和指定列1293.4.5 在WHERE子句中指定范圍、使用通配符和空值1313.4.6 對結果進行排序1343.4.7 SQL內置函數(shù)和計算1353.4.8 內置函數(shù)和分組1383.4.9 使用子查詢處理多個表1393.4.10 使用連接查詢多個表1413.4.11 SQL JOIN…ON語法1453.4.12 外部連接1483.5 修改和刪除關系數(shù)據(jù)的SQL語句1503.5.1 修改數(shù)據(jù)1503.5.2 刪除數(shù)據(jù)1523.6 修改和刪除表和約束的SQL語句1533.6.1 DROP TABLE和ALTERTABLE語句1533.6.2 CHECK約束1543.7 SQL視圖1553.8 Access工作臺:第三部分——在Microsoft Access中使用查詢1553.8.1 使用Microsoft Access SQL1563.8.2 使用Microsoft Access QBE1603.8.3 使用Microsoft Access 參數(shù)查詢1653.8.4 使用Microsoft Access SQL創(chuàng)建表1663.8.5 修改Access表以添加Access SQL不支持的數(shù)據(jù)需求1693.8.6 使用Microsoft Access SQL插入數(shù)據(jù)1743.8.7 使用Access SQL添加參照完整性約束1773.8.8 修改Access數(shù)據(jù)庫以添加Access SQL不支持的約束1783.8.9 關閉數(shù)據(jù)庫并退出Access1803.9 小結1813.10 復習題1823.11 練習題1843.12 Access工作臺練習題1863.13 Garden Glory項目問題1893.14 James River珠寶行項目問題1903.15 Queen Anne Curiosity商店項目問題192第Ⅱ部分 數(shù)據(jù)庫設計和管理第4章 數(shù)據(jù)建模與實體-關系模型1974.1 需求分析階段1984.2 實體-關系數(shù)據(jù)模型1994.2.1 實體1994.2.2 屬性2004.2.3 標識符2004.2.4 關系2014.3 實體-關系圖2044.3.1 E-R模型的不同版本2054.3.2 數(shù)據(jù)建模產品中E-R模型的變化2054.3.3 弱實體2074.3.4 ID依賴實體2074.3.5 非標識符依賴的弱實體2094.3.6 子類實體2124.3.7 遞歸關系2134.4 開發(fā)E-R圖示例2144.4.1 Heather Sweeney Designs公司的數(shù)據(jù)庫2144.4.2 培訓課的客戶列表2144.4.3 給客戶的信函模板2164.4.4 銷售發(fā)貨單2194.4.5 屬性說明2224.4.6 業(yè)務規(guī)則2244.4.7 驗證數(shù)據(jù)模型2244.5 Access工作臺:第四部分——使用Microsoft Access來開發(fā)原型2254.5.1 為原始的數(shù)據(jù)模型創(chuàng)建表單模型2264.5.2 為修改過的數(shù)據(jù)模型創(chuàng)建表單原型2284.5.3 Access的Banded Form and Report Editors2304.5.4 關閉數(shù)據(jù)庫并退出Access2314.6 小結2314.7 復習題2324.8 練習題2344.9 Access工作臺練習題2344.10 Garden Glory項目問題2354.11 James River Jewelry項目問題2354.12 Queen Anne Curiosity 商店項目問題236第5章 數(shù)據(jù)庫設計2395.1 把數(shù)據(jù)模型轉換為數(shù)據(jù)庫的設計方案2405.2 使用關系模型表示實體2415.2.1 ITEM實體的表示2415.2.2 CUSTOMER實體的表示2435.2.3 SALES-COMMISSION實體的關系設計2465.2.4 弱實體的表示2475.3 關系的表示2515.3.1 強實體中的關系2515.3.2 使用了弱實體的關系2585.3.3 子型實體關系的表示2595.3.4 遞歸關系的表示2605.4 Heather Sweeney Designs公司的數(shù)據(jù)庫設計2645.4.1 弱實體2655.4.2 關系2655.4.3 強制參照完整性2665.5 Access工作臺:第五部分——Microsoft Access中的關系2685.5.1 Access中的多對多關系2685.5.2 Access中的一對一關系2685.5.3 關閉數(shù)據(jù)庫并退出Access2735.6 小結2735.7 復習題2745.8 練習題2765.9 Access工作臺練習題2765.10 Garden Glory公司項目問題2775.11 James River珠寶行項目問題2775.12 Queen Anne Curiosity商店項目問題278第6章 數(shù)據(jù)庫管理2796.1 Heather Sweeney Designs公司的數(shù)據(jù)庫2806.2 并發(fā)控制2876.2.1 使用原子事務的必要性2876.2.2 并發(fā)事務處理2886.2.3 丟失更新問題2896.2.4 并發(fā)問題:臟讀取、不可重復讀取和幻象讀取2906.2.5 資源鎖定2906.2.6 串行化事務2926.2.7 死鎖2926.2.8 樂觀鎖定和悲觀鎖定2936.2.9 聲明鎖定特征2946.2.10 一致事務2956.2.11 事務隔離級別2966.3 游標類型2976.4 數(shù)據(jù)庫安全2986.4.1 用戶賬戶2996.4.2 處理權限和責任3006.4.3 DBMS級別的安全3046.4.4 應用程序級別的安全3056.5 數(shù)據(jù)庫備份與恢復3066.5.1 通過重新處理進行恢復3066.5.2 通過回滾和前滾進行恢復3076.5.3 DBA的其他職責3106.6 分布式數(shù)據(jù)庫的處理3106.6.1 分布式數(shù)據(jù)庫的類型3106.6.2 分布式數(shù)據(jù)庫面臨的挑戰(zhàn)3126.7 對象-關系數(shù)據(jù)庫3136.8 Access工作臺:第六部分——Microsoft Access中的數(shù)據(jù)庫管理3136.8.1 Access中的數(shù)據(jù)庫安全3146.8.2 受保護數(shù)據(jù)庫的使用3226.8.3 受保護數(shù)據(jù)庫的管理3246.8.4 關閉數(shù)據(jù)庫并退出Access3246.9 小結3246.10 復習題3266.11 練習題3286.12 Access工作臺練習題3296.13 Garden Glory項目問題3306.14 James River珠寶行項目問題3316.15 Queen Anne Curiosity商店項目問題332第7章 數(shù)據(jù)庫處理應用程序和商業(yè)智能3357.1 數(shù)據(jù)庫處理的環(huán)境3367.1.1 查詢、表單和報表3377.1.2 客戶機/服務器以及傳統(tǒng)的應用程序處理3397.1.3 存儲過程和觸發(fā)器3397.2 Web數(shù)據(jù)庫處理3407.2.1 ODBC3427.2.2 使用IIS進行Web處理3457.2.3 Active Server Pages(ASP)3497.2.4 Active Data Objects(ADO)3527.2.5 Web數(shù)據(jù)庫處理面臨的挑戰(zhàn)3587.3 數(shù)據(jù)庫處理和XML3587.3.1 XML模式文件3597.3.2 XML和數(shù)據(jù)庫處理3607.3.3 XML Web Services3627.4 商業(yè)智能系統(tǒng)3637.5 Access工作臺:第七部分:使用Microsoft Access進行Web數(shù)據(jù)庫處理3677.5.1 Wallingford Motors的Web主頁3677.5.2 選擇數(shù)據(jù)庫文件3697.5.3 創(chuàng)建ODBC數(shù)據(jù)源3707.5.4 創(chuàng)建客戶聯(lián)系方式的視圖3717.5.5 創(chuàng)建ASP頁面3727.5.6 運行ASP頁面3747.5.7 關閉3747.6 小結3757.7 復習題3767.8 練習題3787.9 Access工作臺練習題3807.10 Garden Glory公司項目問題3817.11 James River Jewelry珠寶行項目問題3817.12 Queen Anne Curiosity商店項目問題382附錄A Microsoft SQL Server 2005 Express Edition簡介383附錄B MySQL簡介395附錄C SQL視圖409術語表427
章節(jié)摘錄
6.1 Heather Sweeney Designs公司的數(shù)據(jù)庫 圖6-1給出了使用SQL Server 2005語法創(chuàng)建Heather Sweeney Designs公司(稱作HSD)數(shù)據(jù)庫的SQL語句。該SQL語句是從圖5-24中HSD數(shù)據(jù)庫設計中得到的,列的約束來自于圖4-21中的屬性說明,參照完整性約束如圖5-25所示?! D6-2給出了用于填充HSD數(shù)據(jù)庫的SQL語句,同樣也是用SQL Server 2005語法編寫的。最后,最終得到的HSD數(shù)據(jù)庫如圖6-3中SQL Server 2005 Express Edition中的圖形所示?! D6-1 創(chuàng)建HSD數(shù)據(jù)庫的SQL 語句 圖6-1 (續(xù)) 圖6-2 用來填充HSD數(shù)據(jù)庫的SQL 語句 圖6-2 (續(xù)) 圖6-2 (續(xù)) 圖6-2 (續(xù)) 圖6-3 SQL Server 2005 Express Edition中的HSD數(shù)據(jù)庫 控制、安全和可靠的必要性 從單用戶數(shù)據(jù)庫到大型的跨機構數(shù)據(jù)庫(如航空訂票系統(tǒng)),不同的數(shù)據(jù)庫在大小和涉及領域方面存在巨大差異。如圖6-4所示,它們在處理方式上也有所不同?! D6-4 數(shù)據(jù)庫處理環(huán)境 《數(shù)據(jù)庫原理》將在第7章中討論數(shù)據(jù)庫處理應用程序時詳細定義和討論圖6-4中所給出的各種環(huán)境。至此,只需要知道圖6-4中所有的應用程序元素都可以在同一時間內運行即可。當Web頁面ASP(Active Server Pages)和JSP(Java Server Pages)訪問數(shù)據(jù)庫時,可能會生成查詢、表單和報表,也可能會執(zhí)行存儲過程。在COBOL、C#以及其他程序設計語言中運行的傳統(tǒng)應用程序也可能正在處理數(shù)據(jù)庫的事務。所有這些操作都可能會導致編程代碼存儲到DBMS中——這是將在《數(shù)據(jù)庫原理》第7章中討論的觸發(fā)器和存儲過程。同時,當所有這些程序都在運行時,必須執(zhí)行這些約束(如參照完整性約束)。最后,數(shù)據(jù)庫的用戶可能會達到上百甚至上千,他們可能需要一周7天、一天24小時不間斷地處理數(shù)據(jù)庫?! ∷?,有必要引入3個數(shù)據(jù)庫管理功能,以管理有可能出現(xiàn)的混亂。首先,必須控制并發(fā)用戶的操作,確保其操作所產生的結果與期望的結果一致。第二,必須在適當?shù)臅r候執(zhí)行安全措施,在適當?shù)臅r候只有經過授權的用戶才可以執(zhí)行授權的操作。最后,在數(shù)據(jù)庫出現(xiàn)故障時,必須運行備份和恢復技術和程序來保護數(shù)據(jù)庫,從而在必要時能快速而精確地恢復它。我們將依次考慮以上這些情況,在第7章中還將看到在使用Web應用程序訪問數(shù)據(jù)庫的時候已經開始使用這些管理功能了?! ?.2 并發(fā)控制 并發(fā)控制的目的是保證一個用戶的工作不會對另一個用戶的工作產生不合理的影響。在某些情況下,這些措施保證了當該用戶和其他用戶一起操作時,所得到的結果和他單獨操作時的結果相同。在另一些情況下,這表示用戶的工作按預定的方式受到其他用戶的影響?! ±?,在一個訂貨系統(tǒng)中,用戶應該能夠訪問一個訂單,無論此時是否有其他用戶訪問該訂單,或者同時有上百個用戶在訪問,所得到的結果都相同。另一方面,如果用戶希望打印一份最新的存貨清單,他就可能需要得到其他用戶目前正在改動的數(shù)據(jù),即使這些改動以后可能會被取消?! ∵z憾的是,還沒有一種并發(fā)控制技術或機制可以處理所有的情況。它們都有利有弊。例如,用戶可以通過鎖定整個數(shù)據(jù)庫而得到非常嚴格的并發(fā)控制,但是在這個用戶進行處理時,其他任何用戶都不能執(zhí)行任何操作了。這是嚴格的保護措施,但是這樣做的代價也非常高。正如您將看到的,也可以采取其他措施,可能這些措施更難通過編程的方式實現(xiàn)或執(zhí)行,但是可以得到更多的吞吐量。當然,還有其他一些擴大吞吐量的措施,但也只是對低層次的并發(fā)控制而言。設計多用戶數(shù)據(jù)庫應用程序時,開發(fā)人員必須權衡這些利弊。 6.2.1 使用原子事務的必要性 在大多數(shù)數(shù)據(jù)庫應用中,用戶都以事務的形式提交工作,事務也稱為邏輯工作單元(logical units of work,LUW)。事務(或LUW)是對數(shù)據(jù)庫執(zhí)行的一系列操作,這一系列操作或者全部成功運行,或者是不執(zhí)行其中任何一個操作。在后一種情況下,數(shù)據(jù)庫保持原樣。因為這些事務是以單元的形式執(zhí)行的,所以有時把這樣的事務稱為原子(atomic)事務。在記錄新的訂單時,請考慮以下的一系列數(shù)據(jù)庫操作: (1) 修改客戶記錄,增加Amount Owed值?! ?2) 修改銷售員的記錄,增加Commission Due值?! ?3) 將新的訂單記錄插入到數(shù)據(jù)庫中。 假設最后一步可能由于文件空間不足而失敗。如果前兩個改動都得以執(zhí)行,而第三步卻失敗了,設想這樣可能引起的混亂??蛻艨赡鼙灰蟾犊睿麖膩頉]收到過這個訂單;銷售人員可能會收到關于這個訂單的傭金,而訂單并沒有送給客戶。很明顯,這3個操作需要作為整體來執(zhí)行:或者全部執(zhí)行,或者都不執(zhí)行?! D6-5比較了下面兩種情況的結果:將這些操作作為一系列獨立步驟來執(zhí)行(見圖6-5(a)),以及作為原子事務來執(zhí)行(見圖6-5(b))。注意,當自動執(zhí)行這些步驟而其中一個步驟失敗時,則表明沒有對數(shù)據(jù)庫做任何改動。同時,還應注意應用程序必須使用命令Start Transaction、Commit Transaction和Rollback Transaction等來標記事務邏輯的邊界。對于不同的DBMS產品,這些命令的形式有所不同?! D6-5 應用一系列操作事務和多個步驟事務的結果比較 6.2.2 并發(fā)事務處理 如果一個數(shù)據(jù)庫同時處理兩個事務,則稱這兩個事務為并發(fā)事務。盡管可能在用戶看來好像是同時處理這些并發(fā)事務的,但實際情況并不是這樣,因為處理數(shù)據(jù)庫的機器的中央處理器(CPU)一次只能執(zhí)行一個指令,因此通常這些事務是交叉執(zhí)行的,也就是說,操作系統(tǒng)在不同任務之間來回切換CPU服務,這樣在給定時間間隔內執(zhí)行其中一個事務的某個部分。任務之間的切換非??焖伲匀绻袃蓚€人并排坐在瀏覽器前,同時對同一個數(shù)據(jù)庫進行處理,可以相信他們的事務是同時完成的。但是,事實上這兩個事務是交叉執(zhí)行的。 圖6-6顯示了兩個并發(fā)的事務。用戶A的事務是讀取并修改Item 100,再將其重新寫入數(shù)據(jù)庫中。用戶B執(zhí)行相同的操作,但對象是Item 200。CPU處理用戶A的事務,直到它必須等待讀取或寫入操作完成,或者等待其他的操作完成。然后,操作系統(tǒng)切換到用戶B的控制上。然后,CPU開始處理用戶B的事務,直到發(fā)生類似的對事務處理的中斷,這時操作系統(tǒng)又將控制權轉回到用戶A上。同樣的,對用戶來說,這一處理過程看起來是同步的,但它實際上是交叉執(zhí)行的,或者說是并發(fā)的?! D6-6 兩個用戶的任務并發(fā)處理的示例 6.2.3 丟失更新問題 因為用戶在處理不同的數(shù)據(jù),所以圖6-6所示的并發(fā)處理不會出現(xiàn)什么問題。但是假設兩個用戶同時都希望對Item 100進行操作。例如,用戶A希望訂購5套Item 100,而用戶B則希望訂購3套。 圖6-7描述了這個問題。用戶A讀取Item 100的記錄,該記錄傳送到用戶的工作區(qū)。根據(jù)記錄,還有10套存貨。然后,用戶B讀取Item 100的記錄,這些數(shù)據(jù)又傳送到該用戶的工作區(qū)。同樣,根據(jù)記錄,還有10套存貨?,F(xiàn)在用戶A提取其中的5套,在他的用戶工作區(qū)中將存貨數(shù)目減為5,并將記錄重新寫入Item 100。用戶B提取了3套,在他的用戶工作區(qū)中將存貨數(shù)目減為7,并將記錄重新寫入Item 100。這樣數(shù)據(jù)庫將出現(xiàn)錯誤,顯示還有7套Item 100庫存?;仡櫾摿鞒蹋_始庫存是10,用戶A提取了5套,用戶B提取了3套,數(shù)據(jù)庫最后顯示庫存中還剩7套。顯然,這是錯誤的?! ≡趦蓚€用戶剛獲得數(shù)據(jù)時,這些數(shù)據(jù)是正確的。但是,當用戶B讀取記錄時,用戶A已經有了需要更新的副本。這種情況稱為丟失更新問題(lost update problem)或并發(fā)更新問題(concurrent update problem)。另一個類似的問題稱為非一致讀取問題(inconsistent read problem)。在這種情況下,用戶A讀取的數(shù)據(jù)已經被用戶B的部分事務處理過。其結果是用戶A讀取了錯誤的數(shù)據(jù)?! D6-7 丟失更新問題的示例 6.2.4 并發(fā)問題:臟讀取、不可重復讀取和幻象讀取 并發(fā)處理有可能引起一些問題,這些問題都有其標準化的名字:臟讀取、不可重復讀取和幻象讀取。當一個事務讀取了一個尚未提交到數(shù)據(jù)庫但已經過修改的記錄時,這種情況稱為臟讀取(dirty read)。比如,在下面的情況中就會發(fā)生臟讀?。喝绻粋€事務讀取一行數(shù)據(jù),而這行數(shù)據(jù)被另一個事務修改過,但是后來第二個事務又取消了修改。如果事務重新讀取以前讀取過的數(shù)據(jù),并且發(fā)現(xiàn)另一個事務對其進行了修改和刪除,這稱為不可重復讀取(nonrepeatable read)。當事務重新讀取數(shù)據(jù),但發(fā)現(xiàn)在讀取該數(shù)據(jù)后已有另一事務插入了新的數(shù)據(jù)行,這就稱為幻象讀取(phantom read)?! ?.2.5 資源鎖定 可以通過一種辦法來彌補由并發(fā)處理引起的不一致問題,即在將要修改某些數(shù)據(jù)行或表時禁止多個應用程序同時獲取這些行或表的副本。這個方法稱為資源鎖定(resource locking)。該方法是鎖定將要更新的數(shù)據(jù),從而禁止共享,這樣就防止了并發(fā)處理問題的發(fā)生。圖6-8給出了使用鎖定命令的處理步驟?! ∫驗閿?shù)據(jù)被鎖定,用戶B的事務必須等待,直到用戶A處理完Item 100的數(shù)據(jù)為止。在運用該策略后,只有在用戶A完成對Item 100的修改后,用戶B才可以讀取Item 100的記錄。在這種情況下,最終保存在數(shù)據(jù)庫中的Item 100的數(shù)目是2,這才是正確的數(shù)字(一開始的數(shù)據(jù)是10,然后A取走5,B取走3,最后剩下2)。 圖6-8 帶有顯式鎖定的并發(fā)處理示例 鎖定可以由DBMS自動執(zhí)行,也可以由應用程序或查詢用戶發(fā)給DBMS的命令執(zhí)行。DBMS執(zhí)行的鎖定稱為隱式鎖定(implicit lock);而命令執(zhí)行的鎖定稱為顯式鎖定(explicit lock)。 在前面的示例中,數(shù)據(jù)行被鎖定。但是,不是所有的鎖定都應用在這個級別上。一些DBMS產品的鎖定針對的是頁面級,有些針對表,有些則針對數(shù)據(jù)庫。鎖定的規(guī)模稱為鎖定粒度(lock granularity)。對于粒度較大的鎖定,DBMS容易管理,但是經常引發(fā)沖突。而較小粒度的鎖定則不易管理(DBMS需要跟蹤和檢查許多細節(jié)內容),但是較少引發(fā)沖突的情況?! ℃i定也因類型的不同而各異。排它鎖定(exclusive lock)可以鎖定對產品項的任何類型的訪問。其他任何事務都不可以讀取或修改數(shù)據(jù)。共享鎖定(shared lock)鎖定的是正在修改的產品項,但是不拒絕對數(shù)據(jù)的讀取。這就是說,其他事務可以讀取被鎖定的產品項,只是不能修改數(shù)據(jù)?! ?.2.6 串行化事務 并發(fā)處理兩個或多個事務時,所得數(shù)據(jù)庫的結果在邏輯上應該和事務以任意串行方式處理后所得到的結果保持一致。以這種方式處理并發(fā)事務的模式稱為串行模式。 實現(xiàn)串行化的方式有許多種。一種方式是使用二段鎖定(two-phased locking)處理事務。采用這種策略時,事務可以根據(jù)需要決定是否使用鎖定,但是一旦釋放了第一個鎖定,就不可以再使用其他任何鎖定。因此,事務就有一個增生階段(growing phase),即獲取鎖定的階段,還有一個收縮階段(shrinking phase),即釋放鎖定的階段?! ≡S多DBMS產品使用一種特殊的二段鎖定。如果使用了這類鎖定時,那么在事務的執(zhí)行過程中都可以進行鎖定,但是直到發(fā)出COMMIT或ROLLBACK命令時才能釋放鎖定。這種策略比二段鎖定的要求更嚴格,但更容易實現(xiàn)?! 】紤]一個訂貨事務,該事務涉及處理CUSTOMER表、SALESPERSON表和OREDER表中的數(shù)據(jù)。為了確保數(shù)據(jù)庫不會因為并發(fā)行為而產生異常,訂貨事務在需要時可以鎖定CUSTOMER表、SALESPERSON表和ORDER表,修改所有的數(shù)據(jù)庫,然后釋放所有的鎖定?! ?.2.7 死鎖 盡管鎖定解決了一個問題,但同時也產生了另一個問題??紤]兩個用戶都希望從庫存中訂購兩個產品項時可能發(fā)生的情況。假設用戶A希望訂購一些紙張,如果她可以得到紙張,則可能還需要再訂購一些鉛筆。同樣假設用戶B希望訂購一些鉛筆,如果他可以得到鉛筆,也可能需要再訂購一些紙張。處理過程如圖6-9所示?! ≡趫D6-9中,用戶A和用戶B都被鎖定的狀態(tài)稱為死鎖(deadlock),有時稱為致命包含(deadly embrace)。其中每個用戶都在等待另一個用戶已經鎖定的資源。解決這個問題通常有兩種方法:阻止死鎖發(fā)生,或者允許死鎖發(fā)生,然后打開該死鎖?! D6-9 死鎖示例 有多種方式可以防止死鎖的發(fā)生。一種方法是允許用戶一次只發(fā)出一個鎖定請求;事實上,用戶必須立刻鎖定當前所需的所有資源。如果示例中的用戶A一開始就同時鎖定了紙張和鉛筆記錄,則死鎖無論如何不會發(fā)生。第二種防止死鎖的方法是規(guī)定所有應用程序鎖定資源的順序必須完全相同。 幾乎每一個DBMS都有檢測死鎖的算法。當死鎖發(fā)生時,一般的解決方法是回滾其中的一個事務并取消它對數(shù)據(jù)庫所做的改動?! ?.2.8 樂觀鎖定和悲觀鎖定 激活鎖定的方式一般有兩種。沒有沖突發(fā)生時采用樂觀鎖定(optimistic locking)。讀取數(shù)據(jù),處理事務,執(zhí)行更新,然后檢查是否發(fā)生沖突。如果不存在沖突,事務就可以完成。如果存在沖突,則重復事務,直到沒有沖突。采用悲觀鎖定(pessimistic locking)時,假定存在沖突。首先使用一個鎖定,處理事務,然后釋放鎖定?! D6-10和圖6-11顯示了使用這兩種方式處理同一個示例的情況。在這個示例中,事務將PRODUCT表中鉛筆行的數(shù)量減少5。圖6-10顯示了樂觀鎖定的情況。首先讀取數(shù)據(jù),并且將鉛筆的Quantity當前值存入OldQuantity變量。然后處理事務,假設所有這些操作都得以順利實現(xiàn),則PRODUCT就得到一個鎖。這個鎖可能只對鉛筆行起作用,或者可作用于更高的粒度級別。無論何種情況,都將執(zhí)行一條更新鉛筆行的SQL語句,其中的WHERE條件指定Quantity的當前值等于OldQuantity值。如果沒有其他的事務修改鉛筆行的Quantity值,那么這個UPDATE語句就可成功執(zhí)行。如果有另一個事務修改了鉛筆行的Quantity值,則UPDATE操作將會失敗,需要重新執(zhí)行事務。 圖6-10 樂觀鎖定示例 圖6-11描述了對相同事務采用悲觀鎖定的邏輯。在這種情況下,在所有操作開始運行前,PRODUCT(在某個粒度級別上)得到一個鎖定。然后讀取數(shù)值,處理事務,執(zhí)行UPDATE語句,最后再解除對PRODUCT的鎖定?! 酚^鎖定的優(yōu)點是當事務處理完后才獲取鎖定。因此,鎖定的持續(xù)時間比悲觀鎖定更短。如果事務復雜或客戶機的速度較慢(因為傳輸延遲或用戶在執(zhí)行其他工作、用戶休息或者沒有退出應用程序就關機等),鎖定持續(xù)的時間就會相對少很多。如果鎖定粒度大(如整個PRODUCT表),這個優(yōu)點就顯得更為重要?! D6-11 悲觀鎖定的示例 樂觀鎖定的缺點是,如果針對鉛筆行同時有很多操作,事務就可能必須重復執(zhí)行很多次。因此,如果事務需要對指定行執(zhí)行很多操作(比如購買一種熱門股票),就不適合使用樂觀鎖定?! ?.2.9 聲明鎖定特征 并發(fā)控制是一個復雜的問題;一些鎖定的類型和策略必須經過反復試驗和糾正之后才能決定。因為這個以及其他原因,數(shù)據(jù)庫應用程序一般不顯式地使用鎖定。相反,程序標記事務邊界,然后聲明它們希望DBMS使用的鎖定行為的類型。通過這種方法,如果需要改變鎖定行為,就不需要重新編寫應用程序來鎖定事務的不同區(qū)域,而只需修改鎖定聲明?! D6-12描述了一個鉛筆事務,以BEGIN TRANSACTION、COMMIT TRANSATION和ROLLBACK TRANSACTION等語句標記事務的邊界。這些邊界提供了DBMS執(zhí)行不同鎖定策略所需的基本信息。如果現(xiàn)在開發(fā)人員聲明(通過系統(tǒng)參數(shù)或類似途徑)需要樂觀鎖定,那么DBMS將隱式地在適當?shù)奈恢蒙显O置鎖定類型。如果后來希望改為悲觀鎖定,那么DBMS會隱式地將悲觀鎖定設置在另一個位置?! D6-12 標記事務邊界的示例 6.2.10 一致事務 有時候,會看到首字母縮略詞ACID運用到事務上。所謂ACID事務是一種原子性的(atomic)、一致的(consistent)、隔離的(isolated)和持久的(durable)事務。原子性和持久性都容易定義。原子事務是指或者執(zhí)行事務中所有的數(shù)據(jù)庫操作,或者不執(zhí)行其中任何一個操作。持久性事務是指事務中所有提交的修改都是永久的。DBMS不會取消這些修改,即使在發(fā)生錯誤時也是如此。如果事務是持久的,那么DBMS將在需要時提供輔助措施來恢復在所有提交操作中進行的修改。 術語一致性和隔離性不像原子性和持久性那樣容易定義。請考慮以下的SQL更新命令: UPDATE CUSTOMER SET AreaCode = 425 WHERE ZipCode =98050 假設在CUSTOMER表中有500000行,其中有500行的ZipCode值均為98050。那么DBMS需要花費一些時間才能找到這所有的500行。在這段時間內,允許其他事務更新CUSTOMER的AreaCode或ZipCode字段嗎?如果SQL語句是一致的,這樣的更新就是不允許的。如果在SQL語句執(zhí)行時找到了匹配行,則將對這些行集進行更新。這種一致性稱為語句級一致性(statement level consistency)?! ‖F(xiàn)在考慮包含兩個SQL更新語句的事務: BEGIN TRANSACTION UPDATE CUSTOMER SET AreaCode=425 WHERE ZipCode=98050 . . . {other transaction work} . . . UPDATE CUSTOMER SET Discount=0.05 WHERE AreaCode=425 . . . {other transaction work} . . . COMMIT TRANSACTION 在這個上下文中,“一致性”又表示何種意義呢?語句級一致性表示不同的語句將獨立處理一致的數(shù)據(jù)行,但是在這兩個SQL語句執(zhí)行的間隔中,允許其他用戶對這些數(shù)據(jù)行進行修改。事務級一致性(transaction level consistency)意味著,兩個SQL語句作用到的所有數(shù)據(jù)行在整個事務運行期間都受到保護。 然而,也可以發(fā)現(xiàn),在實現(xiàn)事務級一致性時,事務本身并不能發(fā)現(xiàn)自身的變化。在上面的示例中,第二個SQL語句并不知道有些數(shù)據(jù)行已經被第一個SQL語句改變?! ∫虼耍斅牭健耙恢滦浴边@個術語時,需要進一步確定它屬于哪種一致性。此外,也需要小心處理事務級一致性的潛在問題。隔離(isolated)的情況更為復雜,我們將在接下來的章節(jié)中講解?! ?.2.11 事務隔離級別 1992年,ANSI SQL標準定義了4個事務隔離級別(isolation level),這種隔離標準指定了允許產生哪種并發(fā)控制問題。圖6-13展示了這4個隔離級別?! 「?離 級 別 讀取未提交 讀取已提交 可重復讀取 可串行化 問題 類型 臟讀取 可能 不可能 不可能 不可能 不可重復讀取 可能 可能 不可能 不可能 幻象讀取 可能 可能 可能 不可能 圖6-13 隔離級別匯總 使用這4個隔離級別的目的是讓應用程序編程人員能夠聲明將使用的事務隔離級別,然后由DBMS通過管理鎖定來實現(xiàn)相應的事務隔離級別。如圖6-13所示,“讀取未提交”隔離級別允許“臟讀取”、“不可重復讀取”和“幻象讀取”。在“讀取已提交”隔離級別中,不允許“臟讀取”。在“可重復讀取”隔離級中,禁止“臟讀取”和“不可重復讀取”。而在“可串行化”隔離級別中,禁止上面的3種操作?! ‰m然吞吐量也和工作負荷以及應用程序的編寫方式息息相關,但從總體來說,隔離級別越高,吞吐量越小。而且,不是所有的DBMS產品都會同時支持這4種隔離級別,產品對它們的支持方式和對應用程序開發(fā)人員的要求也各有不同?! ?.3 游標類型 游標(cursor)是一種指針,指向從SQL SELECT語句得到的結果行集,它常常通過SELECT語句來定義。比如,下面的語句定義了一個名為TransCursor的游標,該游標的操作對象是由SELECT語句指定的行集: DECLARE CURSOR TransCursor AS SELECT * FROM [TRANSACTION] WHERE PurchasePrice > 10000; 在應用程序打開某個游標后,該程序可以把該游標放到結果集中的某個地方。最常見的情況是,把游標放到第一行或最后一行,但是也可能放在其他地方。 一個事務可以打開多個游標——可以依次打開,也可以同時打開。此外,可能打開同一個表的兩個或多個游標;可能直接打開關于該表的游標,也可能是通過關于該表的SQL視圖來打開。由于游標需要相當大的內存,因此同時打開很多游標(比如,為一千個當前事務打開游標)將消耗大量的內存。減少游標所帶來負擔的一個方法是定義縮容(reduced-capability)游標,并在不需要滿容量游標的時候使用它們?! D6-14給出了Windows環(huán)境中所使用的4種游標類型(其他系統(tǒng)中的游標類型也與此類似)。最簡單的游標是“只向前游標(forward only cursor)”。通過該游標,應用程序只能向記錄前面執(zhí)行。對于由事務中其他游標或其他事務所做的修改,只有當它們發(fā)生在游標所在行之前才是可見的?! ×硗?種游標類型又被稱為“可滾動游標(scrollable cursor)”,因為應用程序可以向記錄前面或后面滾動。靜態(tài)游標(static cursor)快速繪制并處理關系的圖,使用這種游標進行的修改是可見的,而來自其他源的修改都是不可見的?! 討B(tài)游標(dynamic cursor)是一種很有特色的游標。對于動態(tài)游標而言,所有以行的順序進行的插入、更新、刪除和修改都是可見的。除非事務的隔離級別是臟讀取,否則只有提交的修改才是可見的?! ℃I集游標(keyset cursor)結合了靜態(tài)游標和動態(tài)游標的一些特點。打開該游標后,將保存每一行的主鍵的值。當應用程序把游標放在行中時,DBMS使用該鍵值來讀取行的當前值。由本事務或其他事務中的其他游標所插入的新行是不可見的。如果應用程序發(fā)出一個對行的更新命令而該行已經被其他游標刪掉了,那么DBMS將創(chuàng)建一個新行,該行保持舊的鍵值,并把更新的數(shù)值插入到新行中(假設所有必需的字段都存在)。對于動態(tài)游標而言,除非事務的隔離級別是臟讀取,否則只有已提交的更新和刪除對于游標來說是可見的?! τ诿糠N類型的游標來說,支持游標所需的系統(tǒng)開銷和處理的數(shù)量也不相同。一般來說,開銷隨著類型的下降(如圖6-14所示)而增加。因此,為了提高DBMS的性能,應用程序開發(fā)人員應該創(chuàng)建足以完成工作的游標即可。同時,了解特定的DBMS如何實現(xiàn)游標以及游標是否位于服務器或客戶機上也是非常重要的。有些情況下,把動態(tài)游標放到客戶機上可能比把靜態(tài)游標放到服務器上要更好。因為性能取決于DBMS產品以及應用程序需求所使用的實現(xiàn)方式,所以并沒有規(guī)定一般規(guī)則。 游 標 類 型 說 明 注 釋 只向前游標 應用程序只能向記錄前面移動 對于由事務中其他游標或其他事務所做的修改,只有當它們發(fā)生在游標所在行的前面時才是可見的 靜態(tài)游標 應用程序在打開游標時才可以看到數(shù)據(jù) 由靜態(tài)游標所做的修改是可見的。來自其他源的修改是不可見的。允許向前和向后的滾動 鍵集游標 當打開鍵集游標時,每行的主鍵都保存到了記錄集中。當應用程序訪問行時,該鍵用來取回該行的當前值 來自任何源的更新都是可見的。來自鍵集游標外部的源的插入是不可見的(因為在鍵集中沒有這些源的鍵)。來自鍵集游標的插入顯示在該記錄集的底部。來自任何源的刪除都是可見的。而以行的順序排列的修改都是不可見的。如果隔離級別是臟讀取,那么提交的更新和刪除都是可見的;否則只有提交的更新和刪除才是可見的 動態(tài)游標 任何類型的修改以及來自任何源的修改都是可見的 所有按記錄集順序進行的插入、更新、刪除和修改操作都是可見的。如果隔離級別是臟讀取,那么未提交的修改是可見的。否則,只有提交的修改才是可見的 圖6-14 游標類型的匯總 需要小心的是:如果沒有指定事務的隔離級別或沒有指定被打開游標的類型,那么那么DBMS將使用默認的級別和類型。這些默認的級別和類型對于您的應用程序來說可能非常適合,但是它們也可能成為麻煩。因此,即使可以不考慮這些問題,但是這些問題所帶來的后果也是無法回避的。所以必須搞懂DBMS產品的功能?! ?.4 數(shù)據(jù)庫安全 數(shù)據(jù)庫安全的目的就是確保只有授權用戶才可以在授權時間內進行授權的操作。這一目標通常分為兩個部分:身份驗證(即確保用戶擁有首先使用該系統(tǒng)的基本權限)和授權(即授予用戶對系統(tǒng)進行特定操作的具體權限和許可)。如圖6-15所示,用戶驗證要求用戶通過密碼(或其他明確的身份證明,如手指紋的生物儀器掃描等)登錄到系統(tǒng)中,而用戶授權則是通過授予用戶DBMS特定的許可而達到的?! D6-15 數(shù)據(jù)庫安全的身份驗證與授權 注意,僅僅通過身份驗證(用戶登錄到系統(tǒng)中)對于數(shù)據(jù)庫的使用來說還是不夠的——除非用戶還獲得了相應的許可,否則他(或她)就不可以訪問數(shù)據(jù)庫或執(zhí)行使用數(shù)據(jù)庫的操作?! ∫虼?,實現(xiàn)數(shù)據(jù)庫安全的目標很難,但是無論執(zhí)行哪些改進,數(shù)據(jù)庫開發(fā)小組都必須確定(1)哪些用戶可以使用數(shù)據(jù)庫(即進行身份驗證);(2)每個用戶的處理權限和責任。這些安全需求可以通過DBMS的安全特性以及寫入應用程序的附加安全特性來實現(xiàn)?! ?.4.1 用戶賬戶 比如,考慮示例Heather Sweeney Designs公司的數(shù)據(jù)庫安全需求。必須采取措施來控制訪問數(shù)據(jù)庫的員工。其中一個方法是為每個員工創(chuàng)建用戶賬戶。圖6-16展示了SQL Server 2005中在DBMS安全級別上創(chuàng)建用戶登錄HSD-User的情況。 圖6-16 數(shù)據(jù)庫服務器登錄的創(chuàng)建 該步驟所創(chuàng)建的是DBMS(而不是特定的數(shù)據(jù)庫)中最初的用戶賬戶,相應賦予的密碼是HSD-User+password,在第7章HSD Web頁面中也需要這一密碼。注意,在Windows環(huán)境中,控制身份驗證的方法有兩種:第一種,使用Windows操作系統(tǒng)來控制身份驗證;第二種,通過賬戶的登錄名和密碼來創(chuàng)建SQL Server內部用戶賬戶。對于其他DBMS產品而言,如果沒有像SQL Server一樣被操作系統(tǒng)指定,那么只能使用第二種方法,即使用內部用戶賬戶?! 撔⌒墓芾碛脩糍~戶和密碼。DBMS賬戶和密碼安全的正確術語、特性和功能取決于所使用的DBMS產品?! ?.4.2 處理權限和責任 所有主流的DBMS產品都提供了限制特定客戶對特定對象進行特定操作的工具。DBMS安全的一般模型如圖6-17所示。 圖6-17 DBMS安全模型 根據(jù)圖6-17所示,可以賦予用戶一個或多個角色(組),一個角色可以擁有一個或多個用戶。用戶、角色和對象(使用的是其通用的含義)擁有許多許可。每個許可然后被賦予一個用戶或角色以及一個對象。一旦用戶通過了DBMS的身份驗證,DBMS將把該人的行為限制在用戶確定的許可范圍內,或限制在用戶所賦予的角色的許可范圍內。 現(xiàn)在,考慮Heather Sweeney Designs公司的用戶身份驗證問題。該公司存在3類用戶:administrative assistant(行政助理),management(經理,即Heather),systems administrator(系統(tǒng)管理員,即Heather的顧問)。圖6-18是Heather根據(jù)她的業(yè)務需要確定的處理權限?! ⌒姓砜梢宰x取、插入和修改所有表中的數(shù)據(jù),但是只可以刪除SEMINAR_CUSTOMER和LINE_ITEM中的數(shù)據(jù)。這就意味著,他們有權利從培訓課中刪除客戶,并可以從訂單中刪除產品項。經理除了不能刪除CUSTOMER數(shù)據(jù)外,可以對所有的表執(zhí)行所有操作。這里Heather考慮到,鑒于贏得客戶的不易,她不愿因為不小心刪除了CUSTOMER數(shù)據(jù)而失去客戶?! ∽詈?,系統(tǒng)管理員可以修改數(shù)據(jù)庫的結構,對其他用戶進行授權(授予權限),但不能對數(shù)據(jù)進行操作。系統(tǒng)管理員不是用戶,因此不允許其訪問用戶數(shù)據(jù)。這一限制似乎很有限。畢竟,如果系統(tǒng)管理員可以指定權限,他(或者她)可以通過改變權限來繞開安全系統(tǒng),從而可以進行所需要的任何操作,修改數(shù)據(jù),然后將權限再修改回去。這些情況都有可能發(fā)生,但是會在DBMS日志中留下審計跟蹤。這些以及對安全系統(tǒng)進行改變的需求可以阻止系統(tǒng)管理員進行未授權的活動。這明顯優(yōu)于允許系統(tǒng)管理員具有無效的用戶數(shù)據(jù)訪問權限。
編輯推薦
本書中介紹了在成功管理數(shù)據(jù)庫系統(tǒng)的基本概念,包括:關系模型的基本原理、結構化查詢語言(SQL)、數(shù)據(jù)建模、數(shù)據(jù)庫設計、數(shù)據(jù)庫管理、Web數(shù)據(jù)庫處理。
圖書封面
評論、評分、閱讀與下載