數(shù)據(jù)庫 第7章 數(shù)據(jù)庫應(yīng)用編程_第1頁
數(shù)據(jù)庫 第7章 數(shù)據(jù)庫應(yīng)用編程_第2頁
數(shù)據(jù)庫 第7章 數(shù)據(jù)庫應(yīng)用編程_第3頁
數(shù)據(jù)庫 第7章 數(shù)據(jù)庫應(yīng)用編程_第4頁
數(shù)據(jù)庫 第7章 數(shù)據(jù)庫應(yīng)用編程_第5頁
已閱讀5頁,還剩54頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

第七章數(shù)據(jù)庫應(yīng)用編程了解數(shù)據(jù)庫應(yīng)用程序的體系結(jié)構(gòu)與開發(fā)過程;了解ODBC和JDBC數(shù)據(jù)庫連接了解ASP.NET和JSP的Web數(shù)據(jù)庫開發(fā)技術(shù);掌握游標(biāo)、存儲過程、觸發(fā)器的編程方法;能夠使用一種編程語言,實現(xiàn)數(shù)據(jù)庫應(yīng)用編程。【學(xué)習(xí)目標(biāo)】7.1數(shù)據(jù)庫應(yīng)用程序概述1.數(shù)據(jù)庫應(yīng)用系統(tǒng)是由數(shù)據(jù)庫系統(tǒng)、應(yīng)用程序系統(tǒng)和用戶組成,具體包括:數(shù)據(jù)庫、數(shù)據(jù)庫管理系統(tǒng)、數(shù)據(jù)庫管理員、硬件平臺、軟件平臺、應(yīng)用軟件和應(yīng)用界面。2.數(shù)據(jù)庫應(yīng)用程序:一個通過向DBMS發(fā)出合適的SQL請求語句與數(shù)據(jù)庫進(jìn)行交互的計算機(jī)應(yīng)用程序。(包括:數(shù)據(jù)庫連接、SQL語句執(zhí)行、數(shù)據(jù)庫返回結(jié)果處理和人機(jī)交互界面)3.數(shù)據(jù)庫應(yīng)用系統(tǒng)從作用范圍的角度可分為三種類型:基于單機(jī)的數(shù)據(jù)庫應(yīng)用系統(tǒng)、基于局域網(wǎng)的客戶-服務(wù)器(C/S)數(shù)據(jù)庫應(yīng)用系統(tǒng)、基于互聯(lián)網(wǎng)的瀏覽器-服務(wù)器(B/S)的數(shù)據(jù)庫應(yīng)用系統(tǒng)。4.數(shù)據(jù)庫應(yīng)用程序的開發(fā)過程包含數(shù)據(jù)庫開發(fā)過程和應(yīng)用軟件開發(fā)過程。7.1.1數(shù)據(jù)庫應(yīng)用程序結(jié)構(gòu)1.三層架構(gòu)(3-tierArchitecture)所謂三層體系架構(gòu)是在客戶端與數(shù)據(jù)庫之間加入了一個中間件層,也叫組件層。三層是指邏輯上的三層。三層體系的應(yīng)用程序?qū)I(yè)務(wù)規(guī)則、數(shù)據(jù)訪問、合法性校驗等工作放到了中間層進(jìn)行處理。通常來說,客戶端不與數(shù)據(jù)庫直接進(jìn)行交互,而是與中間層建立連接,再經(jīng)由中間層與數(shù)據(jù)庫進(jìn)行交互。表現(xiàn)層(UI):通俗講就是展現(xiàn)給用戶的界面,即用戶在使用一個系統(tǒng)的時候他的所見所得。業(yè)務(wù)邏輯層(BLL):針對具體問題的操作,也可以說是對數(shù)據(jù)層的操作,對數(shù)據(jù)業(yè)務(wù)邏輯處理。數(shù)據(jù)訪問層(DAL):該層所做事務(wù)直接操作數(shù)據(jù)庫,針對數(shù)據(jù)的增加、刪除、修改、查找等。7.1.2數(shù)據(jù)庫應(yīng)用開發(fā)方法數(shù)據(jù)庫類應(yīng)用程序必須涉及到兩個方面的內(nèi)容,一方面是使用數(shù)據(jù)庫工具建立庫表,另一方面是使用開發(fā)工具開發(fā)應(yīng)用程序,并通過數(shù)據(jù)庫引擎來訪問對應(yīng)的數(shù)據(jù)庫。因此,需要從數(shù)據(jù)庫開發(fā)生命周期(DDLC)和軟件開發(fā)生命周期(SDLC)兩個方面來把握數(shù)據(jù)庫應(yīng)用程序的開發(fā)過程。1.數(shù)據(jù)庫開發(fā)生命周期(DDLC)數(shù)據(jù)庫開發(fā)生命周期是一個設(shè)計、實現(xiàn)和維護(hù)數(shù)據(jù)庫系統(tǒng)的過程,需要符合組織戰(zhàn)略和操作信息的需求。數(shù)據(jù)庫開發(fā)生命周期與信息系統(tǒng)軟件開發(fā)生命周期是內(nèi)在關(guān)聯(lián)的。DDLC與SDLC是同步進(jìn)行的。2.軟件開發(fā)生命周期(SDLC)軟件開發(fā)生命周期是開發(fā)可靠的、可維護(hù)的、高性能的應(yīng)用程序和其他軟件必須遵守的軟件工程框架。軟件過程開始于概念的探討,期間經(jīng)歷一系列軟件開發(fā)過程,結(jié)束于產(chǎn)品的淘汰。1.數(shù)據(jù)庫開發(fā)生命周期(DDLC)1.數(shù)據(jù)庫開發(fā)生命周期(DDLC)了解企業(yè)或組織的運營狀況,分析信息系統(tǒng)如何幫助解決經(jīng)營過程中存在的問題,然后確定系統(tǒng)需求,完成功能規(guī)格說明書??尚行匝芯亢托枨蠓治錾婕耙韵聝?nèi)容:(1)對現(xiàn)存系統(tǒng)和程序的分析(2)系統(tǒng)的技術(shù)可行性、操作可行性和經(jīng)濟(jì)可行性分析(3)信息需求和業(yè)務(wù)過程分析(4)運行環(huán)境和用戶特征分析(5)性能和條件約束分析(6)數(shù)據(jù)項、數(shù)據(jù)量、數(shù)據(jù)存儲和數(shù)據(jù)處理過程分析(7)數(shù)據(jù)屬性和內(nèi)在聯(lián)系(數(shù)據(jù)依賴關(guān)系)分析(8)數(shù)據(jù)操作需求分析(9)數(shù)據(jù)安全需求分析1.數(shù)據(jù)庫開發(fā)生命周期(DDLC)確定符合組織需求的數(shù)據(jù)庫模型(數(shù)據(jù)庫的概念模型)。功能規(guī)格說明書作為數(shù)據(jù)庫設(shè)計階段的輸入,進(jìn)行基于選定的DBMS設(shè)計數(shù)據(jù)庫的邏輯結(jié)構(gòu)和物理結(jié)構(gòu),并完成數(shù)據(jù)庫設(shè)計規(guī)格說明書。數(shù)據(jù)庫設(shè)計涉及以下內(nèi)容:(1)概念數(shù)據(jù)庫設(shè)計,包括定義數(shù)據(jù)庫的元素及相互之間的聯(lián)系,定義特定數(shù)據(jù)項的取值約束(2)邏輯數(shù)據(jù)庫設(shè)計(3)物理數(shù)據(jù)庫設(shè)計1.數(shù)據(jù)庫開發(fā)生命周期(DDLC)根據(jù)選定的DBMS,將詳細(xì)的概念模型轉(zhuǎn)化為DBMS的實現(xiàn)模型。數(shù)據(jù)庫實現(xiàn)階段涉及的內(nèi)容如下:(1)根據(jù)業(yè)務(wù)需求特點和運行環(huán)境進(jìn)行DBMS選型(2)詳細(xì)說明概念的、外部的和內(nèi)部的數(shù)據(jù)定義(3)概念模型到功能數(shù)據(jù)庫的映射(4)構(gòu)建數(shù)據(jù)字典(5)創(chuàng)建空的數(shù)據(jù)庫文件(6)開發(fā)并實現(xiàn)應(yīng)用程序軟件(7)用戶培訓(xùn)1.數(shù)據(jù)庫開發(fā)生命周期(DDLC)加載應(yīng)用數(shù)據(jù),將舊系統(tǒng)切換到新系統(tǒng)1.數(shù)據(jù)庫開發(fā)生命周期(DDLC)測試新的數(shù)據(jù)庫,驗證預(yù)期結(jié)果1.數(shù)據(jù)庫開發(fā)生命周期(DDLC)監(jiān)控數(shù)據(jù)內(nèi)容和應(yīng)用程序的發(fā)展和擴(kuò)充,并可能實施數(shù)據(jù)庫模式的修改或重組2.軟件開發(fā)生命周期(DDLC)1.需要(或概念)階段:研究和精煉概念,同時確定和分析客戶(用戶或計劃)的需求。2.規(guī)格說明階段:將用戶需求寫成規(guī)格說明文檔,闡述軟件產(chǎn)品的預(yù)期功能。3.計劃階段:草擬軟件項目管理計劃,細(xì)化軟件開發(fā)的各個方面。4.設(shè)計階段:為實現(xiàn)軟件規(guī)格說明文檔中的功能而經(jīng)歷兩個連續(xù)的設(shè)計階段。第一個階段是概要設(shè)計階段;第二個階段是詳細(xì)設(shè)計階段。這兩個設(shè)計階段的文檔描述如何實現(xiàn)軟件產(chǎn)品。5.編程(編碼或?qū)崿F(xiàn))階段:用特定的計算機(jī)編程語言編寫各個模塊的代碼。6.集成(測試)階段:完成模塊的單獨測試和集成測試,經(jīng)歷Alpha測試和Beta測試。7.維護(hù)階段:完成所有維護(hù)工作。當(dāng)增強(qiáng)和更改軟件時,需要更新相應(yīng)的軟件規(guī)格說明文檔。7.1.3數(shù)據(jù)庫應(yīng)用開發(fā)技術(shù)近年來,數(shù)據(jù)庫應(yīng)用程序三層架構(gòu)不斷發(fā)展,逐步取代了客戶/服務(wù)器模式。在這種模式下,客戶和數(shù)據(jù)庫服務(wù)器之間增加了一個應(yīng)用服務(wù)器。原先必須在客戶上實現(xiàn)的復(fù)雜業(yè)務(wù)邏輯,全部集中到中間件上,完成了客戶端的“減肥”。甚至,客戶端軟件只需要安裝普通的瀏覽器即可。在數(shù)據(jù)庫應(yīng)用開發(fā)過程中,首先需要建立數(shù)據(jù)庫連接,使得應(yīng)用程序能夠與數(shù)據(jù)庫進(jìn)行數(shù)據(jù)訪問操作。常見的數(shù)據(jù)庫連接方式有ODBC、JDBC和ADO等。在Web數(shù)據(jù)庫應(yīng)用中,常見的兩大技術(shù)是ASP(ActiveServerPages)技術(shù)和JSP(JavaServerPages)技術(shù)。ASP是一種使嵌入網(wǎng)頁中的腳本可由Web服務(wù)器執(zhí)行的服務(wù)器端腳本技術(shù),它可以在通過HTTP請求文檔時再在Web服務(wù)器上動態(tài)創(chuàng)建。JSP是在普通HTML中嵌入了Java程序片段(Scriptlet)和JSP標(biāo)簽的一個腳本技術(shù)。7.2數(shù)據(jù)庫連接技術(shù)應(yīng)用程序在訪問數(shù)據(jù)庫時,需要與DBMS建立通信連接。但是,不同廠家的DBMS提供不同的數(shù)據(jù)庫訪問應(yīng)用程序接口(ApplicationProgrammingInterface,API)。因此,需要提供一種統(tǒng)一的數(shù)據(jù)庫通信方式來屏蔽不同廠家的DBMS的API差異性。數(shù)據(jù)庫連接中間件正是這樣一種技術(shù)。本節(jié)主要介紹ODBC、JDBC和嵌入式SQL技術(shù)。(1)ODBC技術(shù)(2)JDBC技術(shù)(3)SQL與宿主語言7.2.1ODBC技術(shù)ODBC(OpenDatabaseConnectivity,開放數(shù)據(jù)庫互連)是微軟公司開放服務(wù)結(jié)構(gòu)(WOSA,WindowsOpenServicesArchitecture)中有關(guān)數(shù)據(jù)庫的一個組成部分,它建立了一組規(guī)范,并提供了一組對數(shù)據(jù)庫訪問的標(biāo)準(zhǔn)API。這些API利用SQL來完成其大部分任務(wù)。1.ODBC接口為了在Windows平臺下提供統(tǒng)一的數(shù)據(jù)庫訪問方式,Microsoft公司于1992年推出了ODBC產(chǎn)品,并提供ODBCAPI,使應(yīng)用程序與DBMS在邏輯上分離,應(yīng)用程序只需要調(diào)用ODBCAPI,由ODBC驅(qū)動程序?qū)⒄{(diào)用請求轉(zhuǎn)換為對特定數(shù)據(jù)庫的調(diào)用請求。同一個應(yīng)用程序就可以訪問不同的數(shù)據(jù)庫系統(tǒng),存取多個數(shù)據(jù)庫中的數(shù)據(jù),從而提高了應(yīng)用程序的可移植性。與嵌入式SQL相比,ODBC一個最顯著的優(yōu)點是用它生成的應(yīng)用程序與數(shù)據(jù)庫或數(shù)據(jù)庫引擎無關(guān)。2.ODBC體系結(jié)構(gòu)ODBC技術(shù)為應(yīng)用程序提供了一套CLI(Call-LevelInterface,調(diào)用層接口)函數(shù)庫和基于DLL(DynamicLinkLibrary,動態(tài)鏈接庫)的運行支持環(huán)境。使用ODBC開發(fā)數(shù)據(jù)庫應(yīng)用程序時,在應(yīng)用程序中調(diào)用標(biāo)準(zhǔn)的ODBC函數(shù)和SQL語句,通過可加載的驅(qū)動程序?qū)⑦壿嫿Y(jié)構(gòu)映射到具體的DBMS或者應(yīng)用系統(tǒng)所使用的系統(tǒng)中。ODBC是一個分層的體系結(jié)構(gòu),這樣可保證其標(biāo)準(zhǔn)性和開放性,一個完整的ODBC由下列幾個部件組成:用宿主語言和ODBC函數(shù)編寫的應(yīng)用程序用于訪問數(shù)據(jù)庫。其主要任務(wù)是管理安裝ODBC驅(qū)動程序和管理數(shù)據(jù)源應(yīng)用程序要訪問一個數(shù)據(jù)庫,首先必須用ODBC管理器注冊一個數(shù)據(jù)源,管理器根據(jù)數(shù)據(jù)源提供的數(shù)據(jù)庫位置、數(shù)據(jù)庫類型及ODBC驅(qū)動程序等信息,建立起ODBC與具體數(shù)據(jù)庫的聯(lián)系。只要應(yīng)用程序?qū)?shù)據(jù)源名提供給ODBC,ODBC就能建立起與相應(yīng)數(shù)據(jù)庫的連接。這樣,應(yīng)用程序就可以通過驅(qū)動程序管理器與數(shù)據(jù)庫交換信息。驅(qū)動程序管理器負(fù)責(zé)將應(yīng)用程序?qū)DBCAPI的調(diào)用傳遞給正確的驅(qū)動程序,而驅(qū)動程序在執(zhí)行完相應(yīng)的操作后,將結(jié)果通過驅(qū)動程序管理器返回給應(yīng)用程序驅(qū)動程序是實現(xiàn)ODBC函數(shù)和數(shù)據(jù)源交互的DLL,提供了ODBC和數(shù)據(jù)庫之間的接口。當(dāng)應(yīng)用程序調(diào)用SQLConnect或者SQLDriverConnect函數(shù)時,驅(qū)動程序管理器裝入相應(yīng)的驅(qū)動程序是驅(qū)動程序與DBMS連接的橋梁,數(shù)據(jù)源不是DBMS,而是用于表達(dá)一個ODBC驅(qū)動程序和DBMS特殊連接的命名。在連接中,用數(shù)據(jù)源名來代表用戶名、服務(wù)器名、連接的數(shù)據(jù)庫名等,可以將數(shù)據(jù)源名看成是與一個具體數(shù)據(jù)庫建立的連接。創(chuàng)建數(shù)據(jù)源最簡單的方法是使用Windows的ODBC驅(qū)動程序管理器7.2.2JDBC技術(shù)JDBC(JavaDataBaseConnectivity,Java數(shù)據(jù)庫連接)是一種用于執(zhí)行SQL語句的JavaAPI,可以為多種關(guān)系數(shù)據(jù)庫提供統(tǒng)一訪問,它由一組用Java語言編寫的類和接口組成。有了JDBCAPI,就不必為訪問Sybase數(shù)據(jù)庫專門寫一個程序,為訪問Oracle數(shù)據(jù)庫又專門寫一個程序,或為訪問SQLServer數(shù)據(jù)庫又編寫另一個程序等。作為API,JDBC為程序開發(fā)提供標(biāo)準(zhǔn)的接口,并為數(shù)據(jù)庫廠商及第三方中間件廠商實現(xiàn)與數(shù)據(jù)庫的連接提供了標(biāo)準(zhǔn)方法。JDBC使用已有的SQL標(biāo)準(zhǔn)并支持與其他數(shù)據(jù)庫連接標(biāo)準(zhǔn),如ODBC之間的橋接。JDBC實現(xiàn)了所有這些面向標(biāo)準(zhǔn)的目標(biāo)并且具有簡單、嚴(yán)格類型定義且高性能實現(xiàn)的接口。JDBC實際上做了3件事:建立與數(shù)據(jù)庫的連接、發(fā)送SQL、處理結(jié)果7.2.2JDBC技術(shù)【例7-1】給定數(shù)據(jù)庫URL、用戶名和密碼,通過DriverManager建立數(shù)據(jù)庫連接,創(chuàng)建Statement對象,該對象用于執(zhí)行靜態(tài)SQL語句并返回它所生成結(jié)果,對得到的結(jié)果集進(jìn)行遍歷并打印結(jié)果。//建立連接Connectioncon=DriverManager.getConnection("jdbc:odbc:wombat","login","password");//發(fā)送SQLStatementstmt=con.createStatement();ResultSetrs=stmt.executeQuery("SELECTDeptNo,DeptName,ManagerFROMDept");//結(jié)果處理While(rs.next()){ StringdeptNo=rs.getString("DeptNo"); StringdeptName=rs.getString("DeptName"); Stringmanager=rs.getString("Manager"); System.out.println(deptNo+""+deptName+""+manager); }7.2.3SQL與宿主語言SQL語言可以獨立使用,稱為交互式(InteractiveSQL,ISQL)。但I(xiàn)SQL的功能僅限于數(shù)據(jù)庫上操作,缺少數(shù)據(jù)處理能力。而一個應(yīng)用程序既要訪問數(shù)據(jù),又要處理數(shù)據(jù),把SQL嵌入到程序設(shè)計語言,如C,C++,Java等,即宿主語言中,將兩者的功能相結(jié)合起來,是目前解決這個問題的實現(xiàn)途徑。這樣使用的SQL稱為嵌入式SQL(EmbeddedSQL,ESQL)。(1)ESQL的處理過程(2)ESQL與主語言之間的通信(4)ESQL的使用技術(shù)(3)ESQL的使用規(guī)定7.2.3SQL與宿主語言(1)ESQL的處理過程

嵌入式SQL是一個語句級接口,通過程序訪問的數(shù)據(jù)庫模式必須在編寫程序時已知,以便構(gòu)造SQL語句。例如,程序員必須知道數(shù)據(jù)表名稱、列名稱及它的域。對于嵌入式SQL,RDBMS一般采用預(yù)編譯方法處理,即由RDBMS的預(yù)處理程序?qū)υ闯绦蜻M(jìn)行掃描,識別出ESQL語句,把它們轉(zhuǎn)換成主語言調(diào)用語句,以使主語言編譯程序能識別它們,然后由主語言的編譯程序?qū)⒓兊闹髡Z言編譯成目標(biāo)碼。7.2.3SQL與宿主語言(2)

ESQL與主語言之間的通信

將SQL嵌入到高級語言中混合編程,SQL語句負(fù)責(zé)操縱數(shù)據(jù)庫,高級語言語句負(fù)責(zé)控制流程。這時程序中會含有兩種不同的計算模型的語句,從而需要二者之間建立通信。數(shù)據(jù)庫工作單元與源程序工作單元之間的通信主要包括:(1)向主語言傳遞SQL語句的執(zhí)行狀態(tài)信息,使主語言能夠根據(jù)此信息控制程序流程,主要用SQL通信區(qū)實現(xiàn)(2)主語言向SQL語句提供參數(shù),主要用主變量實現(xiàn)(3)將SQL語句查詢數(shù)據(jù)庫的結(jié)果交給主語言處理,主要用主變量和游標(biāo)實現(xiàn)7.2.3SQL與宿主語言(3)

ESQL的使用規(guī)定

為了區(qū)分SQL語句和宿主語言語句,ESQL語句有以下使用規(guī)定:

1.在程序中要區(qū)分SQL語句和宿主語言語句在ESQL中,為了能夠區(qū)分SQL語句與宿主語言語句,所有的SQL語句都必須加前綴標(biāo)識“EXECSQL”,并以“END_EXEC”作為語句的結(jié)束標(biāo)志。嵌入式SQL語句的格式如:EXECSQL<SQL語句>END_EXEC結(jié)束標(biāo)志在不同的宿主語言中可能是不同的,在C和PASCAL語言程序中規(guī)定結(jié)束標(biāo)志為“;”,而不是“END_EXEC”。7.2.3SQL與宿主語言(3)

ESQL的使用規(guī)定

為了區(qū)分SQL語句和宿主語言語句,ESQL語句有以下使用規(guī)定:2.SQL的集合處理方式與宿主語言單記錄處理方式之間的協(xié)調(diào)由于SQL語句處理的是記錄集合,而宿主語言語句一次只能處理一條記錄,因此需要使用游標(biāo)(Cursor)機(jī)制,把集合操作轉(zhuǎn)換為單記錄處理方式。與游標(biāo)有關(guān)的SQL語句如下:1)游標(biāo)定義語句(DECLARE)。游標(biāo)是與某一查詢結(jié)果相聯(lián)系的符號名,游標(biāo)用SQL的DECLARE語句定義,其格式如下:EXECSQLDECLARE<游標(biāo)名>CURSORFOR <SELECT語句>ENDEXEC游標(biāo)定義語句是一個說明語句,定義中的SELECT并不立即執(zhí)行。7.2.3SQL與宿主語言(3)

ESQL的使用規(guī)定

為了區(qū)分SQL語句和宿主語言語句,ESQL語句有以下使用規(guī)定:2.SQL的集合處理方式與宿主語言單記錄處理方式之間的協(xié)調(diào)由于SQL語句處理的是記錄集合,而宿主語言語句一次只能處理一條記錄,因此需要使用游標(biāo)(Cursor)機(jī)制,把集合操作轉(zhuǎn)換為單記錄處理方式。與游標(biāo)有關(guān)的SQL語句如下:2)游標(biāo)打開語句(OPEN)。該語句在執(zhí)行游標(biāo)定義中的SELECT語句,同時游標(biāo)處于活動狀態(tài)。游標(biāo)是一個指針,此時指向查詢結(jié)果的第一行之前。OPEN語句的格式如下:EXECSQLOPEN<游標(biāo)名>END_EXEC7.2.3SQL與宿主語言(3)

ESQL的使用規(guī)定

為了區(qū)分SQL語句和宿主語言語句,ESQL語句有以下使用規(guī)定:2.SQL的集合處理方式與宿主語言單記錄處理方式之間的協(xié)調(diào)由于SQL語句處理的是記錄集合,而宿主語言語句一次只能處理一條記錄,因此需要使用游標(biāo)(Cursor)機(jī)制,把集合操作轉(zhuǎn)換為單記錄處理方式。與游標(biāo)有關(guān)的SQL語句如下:3)游標(biāo)推進(jìn)語句(FETCH)。此時游標(biāo)推進(jìn)一行,并把游標(biāo)指向的行(即當(dāng)前行)中的值取出并送到共享變量,其格式如下:EXECSQLFETCHFROM<游標(biāo)名>INTO<變量表>END_EXEC變量表由逗號分開的共享變量組成。FETCH語句通常置于宿主語言程序的循環(huán)結(jié)構(gòu)中,并借助宿主語言的處理語句逐一處理查詢結(jié)果中的每一個元組。7.3WEB數(shù)據(jù)庫系統(tǒng)技術(shù)

Web數(shù)據(jù)庫管理系統(tǒng)是指基于Web模式的DBMS的信息服務(wù),充分發(fā)揮DBMS高效的數(shù)據(jù)存儲和管理能力,以Web這種瀏覽器/服務(wù)器(B/S)模式為平臺,將客戶端融入統(tǒng)一的Web瀏覽器,為Internet用戶提供使用簡便、內(nèi)容豐富的服務(wù)。Web數(shù)據(jù)庫管理系統(tǒng)必將成為Internet和Intranet提供的核心服務(wù),為Internet上的電子商務(wù)提供技術(shù)支持。Web數(shù)據(jù)庫處理環(huán)境7.3.1ASP.NET技術(shù)

ASP.NET是微軟公司的.NETFrameWork的一部分。它是一個開發(fā)框架,用于通過HTML、CSS、JavaScript以及服務(wù)器腳本來構(gòu)建網(wǎng)頁和網(wǎng)站。與直接由Web服務(wù)器提供的靜態(tài)HTML不同的是,ASP.NET頁面實際上是在服務(wù)器上執(zhí)行以后再產(chǎn)生結(jié)果的。ASP.NET的體系結(jié)構(gòu)7.3.1ASP.NET技術(shù)

所有Web客戶端都通過Internet信息服務(wù)(IIS)與ASP.NET應(yīng)用程序進(jìn)行通訊。IIS解釋請求并且有選擇地對請求進(jìn)行身份驗證。如果將“允許匿名”設(shè)置為true,則不會進(jìn)行身份驗證。IIS也會查找所請求的資源(如ASP.NET應(yīng)用程序),如果客戶端得到了授權(quán),則會返回相應(yīng)的資源。ASP.NET的體系結(jié)構(gòu)7.3.1ASP.NET技術(shù)ASP.NET是ASP和.NET相結(jié)合的產(chǎn)物,它與.NET框架緊密集成,可以利用.NET提供的新功能來創(chuàng)建動態(tài)Web頁面,其中包含了許多新的特性:(1)代碼編譯執(zhí)行(2)靈活性(3)簡易性(4)可管理性(5)安全性影響ASP性能的一個重要的原因就是它是基于腳本(VBScript或JavaScript)的。腳本語言有兩大缺陷:它們是解釋型的并且分類不嚴(yán)格,從而導(dǎo)致執(zhí)行速度慢、效率低。與解釋語言不同,ASP.NET可利用早期綁定、實時編譯、本機(jī)優(yōu)化等服務(wù),即便代碼是腳本語言,它也會在執(zhí)行前被編譯,因此Javascript代碼頁面的性能也會得到提高。由于ASP.NET基于公共語言運行庫,因此Web應(yīng)用程序開發(fā)人員可以利用整個平臺的威力和靈活性。.NET框架類庫、消息處理和數(shù)據(jù)訪問解決方案都可以從Web中無縫訪問。此外,開發(fā)ASP.NET也與語言無關(guān),所以可以選擇最適合應(yīng)用程序的語言,或跨多種語言來分割應(yīng)用程序進(jìn)行開發(fā)。在集成的.NET框架中,ASP.NET可以非常方便地開發(fā)Web應(yīng)用程序和XMLWeb服務(wù),同時站點的配置、發(fā)布也非常方便。對于簡單的ASP應(yīng)用程序,配置其實并不復(fù)雜,但是當(dāng)程序移植到一個利用組件的N層機(jī)構(gòu)中時就會遇到問題。當(dāng)對這些應(yīng)用程序進(jìn)行配置和維護(hù)時,DLL陷阱問題就會出現(xiàn)。ASP.NET中取消了組件注冊以及DLL鎖定,全面使用了XML配置文件,從而解決了這個問題。作為.NET框架的一部分,ASP.NET提供了很多高級安全功能,包括實現(xiàn)身份驗證和授權(quán)解決方案的機(jī)制、對角色和身份標(biāo)識的支持,可以實現(xiàn)自定義身份驗證和授權(quán)的架構(gòu),與微軟的.NETPassport集成,確保代碼訪問安全。7.3.2JSP技術(shù)

JSP(JavaServerPages)是在普通HTML中嵌入了Java程序片段(Scriptlet)和JSP標(biāo)簽的一個腳本。JSP網(wǎng)頁Java程序片段可以操縱數(shù)據(jù)庫、重新定向網(wǎng)頁以及發(fā)送E-mail等,實現(xiàn)建立動態(tài)網(wǎng)站所需要的功能。所有程序操作都在服務(wù)器端執(zhí)行,網(wǎng)絡(luò)上傳送給客戶端的僅是得到的結(jié)果,這樣大大降低了對客戶瀏覽器的要求,即使客戶瀏覽器端不支持Java,也可以訪問JSP網(wǎng)頁。7.3.2JSP技術(shù)

1.JSP的工作原理7.3.2JSP技術(shù)3.JSP的內(nèi)置對象(1)Request對象(2)Response對象(3)Session對象(4)Aplication對象(5)Out對象(6)Cookie對象該對象封裝了用戶提交的信息,通過調(diào)用該對象相應(yīng)的方法可以獲取封裝的信息,即使用該對象可以獲取用戶提交信息。Response對象對客戶的請求做出動態(tài)的響應(yīng),向客戶端發(fā)送數(shù)據(jù)。Session對象是一個JSP內(nèi)置對象,它在第一個JSP頁面被裝載時自動創(chuàng)建,完成會話期管理。服務(wù)器啟動后就產(chǎn)生了Application對象,當(dāng)客戶再所訪問的網(wǎng)站的各個頁面之間瀏覽時,這個Application對象都是同一個,直到服務(wù)器關(guān)閉。但是與Session不同的是,所有客戶的Application對象都是同一個,即所有客戶共享這個內(nèi)置的Application對象。Out對象是一個輸出流,用來向客戶端輸出數(shù)據(jù)。Cookie是Web服務(wù)器保存在用戶硬盤上的一段文本。Cookie允許一個Web站點在用戶的電腦上保存信息并且隨后再取回它。Cookie是以“關(guān)鍵字key=值value“的格式來保存紀(jì)錄的。7.3.2JSP技術(shù)

4.JSP的簡單例子【例7-3】通過newDate()顯示當(dāng)前日期和時間,創(chuàng)建JSP文件,其內(nèi)容如下:保存為example.jsp,并發(fā)布于Tomcat服務(wù)器,該JSP文件將被編譯成Servlet。<html><head><title>FirstPage</title></head><body><H3>Hello,todayis:<%=newjava.util.Date()%><!--將編譯成Servlet,在服務(wù)器端運行--></H3></body></html>例7-3在Tomcat服務(wù)器上運行的結(jié)果7.3.2JSP技術(shù)

5.JSP通過JDBC連接數(shù)據(jù)庫(1)獲取數(shù)據(jù)庫連接(2)執(zhí)行SQL語句(3)處理執(zhí)行結(jié)果(4)釋放連接用DriverManager獲取數(shù)據(jù)庫連接,如SQLServer數(shù)據(jù)庫的連接://SQLServer的JDBC驅(qū)動程序名稱StringdriverName="com.microsoft.sqlserver.jdbc.SQLServerDriver";//名為Teaching數(shù)據(jù)庫的SQLServer連接字符串Stringurl="jdbc:sqlserver://localhost:1433;DatabaseName=Teaching";StringuserName="sa";//用戶名StringuserPwd="sa";//密碼Class.forName(driverName);Connectionconn=DriverManager.getConnection(url,userName,userPwd);可以采用Statement或PreparedStatement來執(zhí)行SQL語句,如:Stringsql;Statementstmt=conn.createStatement();ResultSetrs=stmt.executeQuery(sql);//執(zhí)行數(shù)據(jù)查詢語句(select)stmt.executeUpdate(sql);//執(zhí)行數(shù)據(jù)更新語句(delete、update、insert、drop等)stmt.close();遍歷訪問結(jié)果集的形式如:while(rs.next()){ System.out.println("第一個字段值為:"+rs.getString(1));System.out.println("姓名為:"+rs.getString(“姓名”));}一般地,先關(guān)閉ResultSet,然后關(guān)閉Statement(或者PreparedStatement),最后關(guān)閉Connection。連接關(guān)閉如下:rs.close();//關(guān)閉ResultSetstmt.close();//關(guān)閉Statementconn.close();//關(guān)閉Connection7.4游標(biāo)編程

DBMS通過游標(biāo)(Cursor)提供了一種從記錄集中逐一訪問記錄的靈活手段。就本質(zhì)而言,游標(biāo)實際上是一種能從包括多條數(shù)據(jù)記錄的結(jié)果集中每次提取一條記錄的機(jī)制。游標(biāo)總是與一條SQL選擇語句(Select)相關(guān)聯(lián)。SQLServer支持三種類型的游標(biāo):Transact_SQL游標(biāo),API服務(wù)器游標(biāo)和客戶游標(biāo)。7.4游標(biāo)編程

(1)Transact_SQL游標(biāo)Transact_SQL游標(biāo)是由DECLARECURSOR語法定義,主要用在Transact_SQL腳本、存儲過程和觸發(fā)器中。Transact_SQL游標(biāo)主要用在服務(wù)器上,由從客戶端發(fā)送給服務(wù)器的Transact_SQL語句或是批處理、存儲過程、觸發(fā)器中的Transact_SQL進(jìn)行管理。Transact_SQL游標(biāo)不支持提取數(shù)據(jù)塊或多行數(shù)據(jù)。(2)API游標(biāo)API服務(wù)器游標(biāo)支持在OLEDB、ODBC以及DB_library中使用游標(biāo)函數(shù),主要用在服務(wù)器上。每一次客戶端應(yīng)用程序調(diào)用API游標(biāo)函數(shù),SQLServer的OLEDB提供者、ODBC驅(qū)動器或DB_library的動態(tài)鏈接庫(DLL)都會將這些客戶請求傳送給服務(wù)器以對API服務(wù)器游標(biāo)進(jìn)行處理。(3)客戶游標(biāo)客戶游標(biāo)主要是當(dāng)在客戶機(jī)上緩存結(jié)果集時才使用。在客戶游標(biāo)中,有一個默認(rèn)的結(jié)果集被用來在客戶機(jī)上緩存整個結(jié)果集??蛻粲螛?biāo)僅支持靜態(tài)游標(biāo)而非動態(tài)游標(biāo)。由于服務(wù)器游標(biāo)并不支持所有的Transact-SQL語句或批處理,所以客戶游標(biāo)常常僅被用作服務(wù)器游標(biāo)的輔助。因為在一般情況下,服務(wù)器游標(biāo)能支持絕大多數(shù)的游標(biāo)操作。7.4.2游標(biāo)結(jié)構(gòu)

定義一個游標(biāo)的語法格式如下:DECLAREcursor_name[INSENSITIVE][SCROLL]CURSOR

FORselect_statement

[FOR{READONLY|UPDATE[OFcolumn_name[,…n]]}]cursor_name:游標(biāo)的名字。INSENSITIVE:將游標(biāo)定義所選取出來的數(shù)據(jù)記錄存放在一臨時表內(nèi)。對該游標(biāo)的讀取操作皆由臨時表來應(yīng)答。因此,對基本表的修改并不影響游標(biāo)提取的數(shù)據(jù),即游標(biāo)不會隨著基本表內(nèi)容的改變而改變,同時也無法通過游標(biāo)來更新基本表。如果不使用該保留字,那么對基本表的更新、刪除都會反映到游標(biāo)中。

SCROLL:表明所有的提取操作(如FIRST、LAST、PRIOR、NEXT、RELATIVE、ABSOLUTE)都可用。如果不使用該保留字,那么只能進(jìn)行NEXT提取操作。由此可見,SCROLL極大地增加了提取數(shù)據(jù)的靈活性,可以隨意讀取結(jié)果集中的任一行數(shù)據(jù)記錄,而不必關(guān)閉再重開游標(biāo)。

select_statement:定義結(jié)果集的SELECT語句。應(yīng)該注意的是,在游標(biāo)中不能使用COMPUTE、COMPUTEBY、FORBROWSE、INTO語句。

READONLY:表明不允許游標(biāo)內(nèi)的數(shù)據(jù)被更新,盡管在默認(rèn)狀態(tài)下游標(biāo)是允許更新的。而且在UPDATE或DELETE語句的WHERECURRENTOF子句中,不允許對該游標(biāo)進(jìn)行引用。

UPDATE[OFcolumn_name[,…n]]:定義在游標(biāo)中可被修改的列,如果不指出要更新的列,那么所有的列都將被更新。當(dāng)游標(biāo)被成功創(chuàng)建后,游標(biāo)名成為該游標(biāo)的唯一標(biāo)識,也是在以后的存儲過程、觸發(fā)器或Transact_SQL腳本中使用的名字。7.4.3游標(biāo)編程

每一個游標(biāo)必須有4個組成部分,它們必須符合以下順序:聲明(DECLARE)游標(biāo)打開(OPEN)游標(biāo)從一個游標(biāo)中逐條獲?。‵ETCH)并處理記錄信息關(guān)閉(CLOSE)或釋放(DEALLOCATE)游標(biāo)游標(biāo)是用于迭代訪問SELECT語句查詢出的結(jié)果集。聲明游標(biāo)就是確定游標(biāo)的屬性,制定游標(biāo)的查詢結(jié)果集。聲明游標(biāo)的語法格式已經(jīng)在上一節(jié)進(jìn)行了描述。打開游標(biāo)語句執(zhí)行游標(biāo)定義中的查詢語句,查詢結(jié)果存放在游標(biāo)緩沖區(qū)中,并使游標(biāo)指針指向游標(biāo)區(qū)中的第一個元組,作為游標(biāo)的默認(rèn)訪問位置。查詢結(jié)果的內(nèi)容取決于查詢語句的設(shè)置和查詢條件。打開游標(biāo)的語法如下:OPEN游標(biāo)名稱;讀游標(biāo)區(qū)數(shù)據(jù)語句是讀取游標(biāo)區(qū)中當(dāng)前元組的值,并將各分量依次賦給指定的共享主變量。FETCH語句用于讀取游標(biāo)中的數(shù)據(jù),語句格式為:FETCH[[NEXT|PRIOR|FIRST|LAST|ABSOLUTEn|RELATIVEn]from]游標(biāo)名[INTO@局部變量[,…n]]NEXT:表示返回結(jié)果集中當(dāng)前行的下一行記錄,如果第一次讀取則返回第一行。默認(rèn)的讀取選項為NEXT。PRIOR:表示返回結(jié)果集中當(dāng)前行的前一行記錄,如果第一次讀取則沒有行返回,并且把游標(biāo)置于第一行之前。FIRST:表示返回結(jié)果集中的第一行,并且將其作為當(dāng)前行。LAST:表示返回結(jié)果集中的最后一行,并且將其作為當(dāng)前行。ABSOLUTEn:如果n為正數(shù),則返回從游標(biāo)頭開始的第n行,并且返回行變成新的當(dāng)前行;如果n為負(fù),則返回從游標(biāo)末尾開始的第n行,并且返回行為新的當(dāng)前行;如果n為0,則返回當(dāng)前行。RELATIVEn:如果n為正數(shù),則返回從當(dāng)前行開始的第n行;如果n為負(fù),則返回從當(dāng)前行之前的第n行;如果為0,則返回當(dāng)前行。INTO:表示將游標(biāo)當(dāng)前字段值賦值給對應(yīng)的局部變量。在處理完游標(biāo)中數(shù)據(jù)之后必須關(guān)閉游標(biāo)來釋放數(shù)據(jù)結(jié)果集和定位于數(shù)據(jù)記錄上的鎖。CLOSE語句關(guān)閉游標(biāo),但不釋放游標(biāo)占用的數(shù)據(jù)結(jié)構(gòu)。如果準(zhǔn)備在隨后的使用中再次打開游標(biāo),則應(yīng)使用CLOSE命令。關(guān)閉游標(biāo)的語法規(guī)則為:CLOSE{{[GLOBAL]cursor_name}|cursor_variable_name}游標(biāo)可應(yīng)用在存儲過程、觸發(fā)器和Transact_SQL腳本中。如果在聲明游標(biāo)與釋放游標(biāo)之間使用了事務(wù)結(jié)構(gòu),則在結(jié)束事務(wù)時游標(biāo)會自動關(guān)閉。7.4.2游標(biāo)結(jié)構(gòu)

(5)釋放游標(biāo)在使用游標(biāo)時,各種針對游標(biāo)的操作或者引用游標(biāo)名,或者引用指向游標(biāo)的游標(biāo)變量。當(dāng)CLOSE命令關(guān)閉游標(biāo)時,并沒有釋放游標(biāo)占用的數(shù)據(jù)結(jié)構(gòu)。因此常使用DEALLOCATE命令。通過該命令可以刪除掉游標(biāo)與游標(biāo)名或游標(biāo)變量之間的聯(lián)系,并且釋放游標(biāo)占用的所有系統(tǒng)資源。其語法規(guī)則為:DEALLOCATE{{[GLOBAL]cursor_name}|@cursor_variable_name}當(dāng)使用DEALLOCATE@cursor_variable_name來刪除游標(biāo)時,游標(biāo)變量并不會被釋放,除非超過使用該游標(biāo)的存儲過程、觸發(fā)器的范圍(即游標(biāo)的作用域)。7.5.1存儲過程的概念

存儲過程是一組已被編輯在一起的,存儲在服務(wù)器上的,執(zhí)行某種功能的預(yù)編譯SQL語句。它是一種封裝重復(fù)任務(wù)操作方法,支持用戶提供的參數(shù)變量,具有強(qiáng)大的編程能力。存儲過程非常類似于DOS系統(tǒng)中的批處理文件。它將完成某項任務(wù)的許多SQL語句寫在一起,組成命令集合的形式,然后通過執(zhí)行該存儲過程就可以完成相應(yīng)的任務(wù)。存儲過程具有許多優(yōu)點:(1)加快程序的執(zhí)行速度(2)減少網(wǎng)絡(luò)的數(shù)據(jù)流量(3)提供了一種安全機(jī)制(4)允許程序模塊化設(shè)計(5)提高編程的靈活性7.5.1存儲過程的概念

在SQLServer中,存儲過程包括系統(tǒng)存儲過程、本地存儲過程、臨時存儲過程、遠(yuǎn)程存儲過程和擴(kuò)展存儲過程。(1)系統(tǒng)存儲過程以sp_開頭,用來進(jìn)行系統(tǒng)的各項設(shè)定、取得信息和相關(guān)管理工作。(2)本地存儲過程用戶創(chuàng)建的存儲過程是由用戶創(chuàng)建并完成某一特定功能的存儲過程,事實上一般所說的存儲過程就是指本地存儲過程。(3)臨時存儲過程臨時存儲過程分為兩種存儲過程:一是本地臨時存儲過程,以井字號(#)作為其名稱的第一個字符,該存儲過程將成為一個存放在TEMPDB數(shù)據(jù)庫中的本地臨時存儲過程,且只有創(chuàng)建它的用戶才能執(zhí)行它;二是全局臨時存儲過程,以兩個井字號(##)開始,該存儲過程將成為一個存儲在TEMPDB數(shù)據(jù)庫中的全局臨時存儲過程,全局臨時存儲過程一旦創(chuàng)建,以后連接到服務(wù)器的任意用戶都可以執(zhí)行它,而且不需要特定的權(quán)限。7.5.1存儲過程的概念

在SQLServer中,存儲過程包括系統(tǒng)存儲過程、本地存儲過程、臨時存儲過程、遠(yuǎn)程存儲過程和擴(kuò)展存儲過程。(4)遠(yuǎn)程存儲過程在SQLServer中,遠(yuǎn)程存儲過程(RemoteStoredProcedures)是位于遠(yuǎn)程服務(wù)器上的存儲過程,通常可以使用分布式查詢和EXECUTE命令執(zhí)行一個遠(yuǎn)程存儲過程。(5)擴(kuò)展存儲過程擴(kuò)展存儲過程(ExtendedStoredProcedures)是用戶可以使用外部程序語言編寫的存儲過程,而且擴(kuò)展存儲過程的名稱通常以xp_開頭。7.5.1存儲過程的概念

在SQLServer中,存儲過程包括系統(tǒng)存儲過程、本地存儲過程、臨時存儲過程、遠(yuǎn)程存儲過程和擴(kuò)展存儲過程。(4)遠(yuǎn)程存儲過程在SQLServer中,遠(yuǎn)程存儲過程(RemoteStoredProcedures)是位于遠(yuǎn)程服務(wù)器上的存儲過程,通??梢允褂梅植际讲樵兒虴XECUTE命令執(zhí)行一個遠(yuǎn)程存儲過程。(5)擴(kuò)展存儲過程擴(kuò)展存儲過程(ExtendedStoredProcedures)是用戶可以使用外部程序語言編寫的存儲過程,而且擴(kuò)展存儲過程的名稱通常以xp_開頭。7.5.2存儲過程結(jié)構(gòu)

存儲過程包括過程首部和過程體兩部分,其創(chuàng)建語句的基本格式如下:CREATEPROC[EDURE]procedure_name[;number] /*存儲過程首部*/[{@parameterdata_type}[VARYING][=default][OUTPUT]][,…n][WITH{RECOMPILE|ENCRYPTION|RECOMPILE,ENCRYPTION}][FORREPLICATION]AS<SQL語句塊>[…n]/*存儲過程體,描述該存儲過程的操作*/procedure_name:存儲過程名稱[;number]:可選的整數(shù),用來對同名的過程分組@parameter:參數(shù)列表{RECOMPILE|ENCRYPTION|RECOMPILE,ENCRYPTION}:RECOMPILE表明SQLServer不會緩存該過程的計劃,該過程將在運行時重新編譯。FORREPLICATION:指定不能在訂閱服務(wù)器上執(zhí)行為復(fù)制創(chuàng)建的存儲過程。7.5.2存儲過程結(jié)構(gòu)

關(guān)于參數(shù)的使用說明如下:?每個存儲過程中最多設(shè)定1024個參數(shù)?用名字來標(biāo)識調(diào)用時給出的參數(shù)值,必須指定值的參數(shù)類型?每個參數(shù)名前要有一個“@”符號,每一個存儲過程的參數(shù)僅為該程序內(nèi)部使用?data_type參數(shù)的數(shù)據(jù)類型。所有數(shù)據(jù)類型(包括text、ntext和image)均可以用作存儲過程的參數(shù)。不過,cursor數(shù)據(jù)類型只能用于OUTPUT參數(shù)。如果指定的數(shù)據(jù)類型為cursor,也必須同時指定VARYING和OUTPUT關(guān)鍵字。?VARYING指定作為輸出參數(shù)支持的結(jié)果集(由存儲過程動態(tài)構(gòu)造,內(nèi)容可以變化)。僅適用于游標(biāo)參數(shù)。?OUTPUT表明參數(shù)是返回參數(shù)。該選項的值可以返回給EXEC[UTE]。使用OUTPUT參數(shù)可將信息返回給調(diào)用過程。使用OUTPUT關(guān)鍵字的輸出參數(shù)可以是游標(biāo)占位符。存儲過程的參數(shù)可以定義輸入?yún)?shù)(INPUT)、輸出參數(shù)(OUTPUT)、輸入/輸出參數(shù)(INPUT/OUTPUT)。默認(rèn)為INPUT參數(shù)。?default參數(shù)的默認(rèn)值。如果定義了默認(rèn)值,不必指定該參數(shù)的值即可執(zhí)行過程。默認(rèn)值必須是常量或NULL。7.5.3存儲過程編程

存儲過程的操作操作包括創(chuàng)建、重命名、執(zhí)行和刪除4種(2)重命名存儲過程存儲過程的重命名語句格式為:ALTERPROCEDURE舊過程名稱RENAMETO新過程名稱;(3)執(zhí)行存儲過程存儲過程的執(zhí)行語句格式為:

CALL/PERFORM/EXECUTEPROCEDURE過程名([參數(shù)1,參數(shù)2,…]);在大多數(shù)DBMS中數(shù)據(jù)庫服務(wù)器支持存儲過程的嵌套調(diào)用。(4)刪除存儲過程存儲過程的刪除語句格式為:

DROPPROCEDURE過程名;(5)帶有游標(biāo)的存儲過程在存儲過程中可以使用游標(biāo)來遍歷SELECT語句的結(jié)果集,從而對逐條數(shù)據(jù)進(jìn)行業(yè)務(wù)邏輯處理。7.6觸發(fā)器編程

從本質(zhì)上看,觸發(fā)器是一種特殊的存儲過程,它不同于我們前面介紹過的存儲過程。觸發(fā)器主要是通過事件進(jìn)行觸發(fā)而被執(zhí)行的,而存儲過程可以通過存儲過程名字而被直接調(diào)用。觸發(fā)器在插入、刪除或修改特定表中的數(shù)據(jù)時觸發(fā)執(zhí)行,它比數(shù)據(jù)庫本身標(biāo)準(zhǔn)的功能有更精細(xì)和更復(fù)雜的數(shù)據(jù)控制能力。當(dāng)使用INSERT、DELETE、UPDATE命令對觸發(fā)器所保護(hù)的數(shù)據(jù)進(jìn)行修改時,觸發(fā)器能夠被自動激活,從而確保對數(shù)據(jù)的處理必須符合由這些SQL語句所定義的規(guī)則。它除了能夠完成復(fù)雜的完整性約束以外,還可以在主動數(shù)據(jù)庫(ActiveDatabase)的應(yīng)用中對不同的外部事件做出及時反應(yīng)。7.6.1觸發(fā)器的概念

條件:觸發(fā)器將測試條件是否成立。如果條件成立,就執(zhí)行相應(yīng)動作,否則什么也不做。觸發(fā)器(Trigger)是數(shù)據(jù)庫模式的一個元素。它是一個能由系統(tǒng)自動執(zhí)行對數(shù)據(jù)庫修改的語句。觸發(fā)器有時也稱為“主動規(guī)則”(ActiveRule)或“事件-條件-動作規(guī)則”(Event-Condition-ActionRule,ECA規(guī)則)。它的結(jié)構(gòu)如下:ON事件;IF前提條件;THEN動作;一個觸發(fā)器由3部分組成:

事件:事件是指對數(shù)據(jù)庫的插入、刪除、修改等操作。觸發(fā)器在這些事件開始發(fā)生時將開始工作。

動作:如果觸發(fā)器測試滿足預(yù)定的條件,那么就由DBMS執(zhí)行這些動作,即對數(shù)據(jù)庫的操作。這些動作能使觸發(fā)事件不發(fā)生,即撤銷事件,如刪除一個插入的元組等。這些動作也可以是一系列對數(shù)據(jù)庫的操作,甚至可以是與觸發(fā)事件本身無關(guān)的其他操作。7.6.1觸發(fā)器的概念

業(yè)務(wù)規(guī)則:業(yè)務(wù)是對基本規(guī)則簡潔的正式陳述,這些基本規(guī)則是企業(yè)中業(yè)務(wù)運作的基礎(chǔ)。觸發(fā)器在數(shù)據(jù)庫處理中充當(dāng)很多角色:

維護(hù)約束:前面討論了觸發(fā)器可以用于維護(hù)外碼和語義約束。這種類型的觸發(fā)器通常形式是使用ONDELETE和ONUPDATE子句。

監(jiān)控:由于在數(shù)據(jù)庫中每條新記錄的插入都是一個事件,觸發(fā)器可以間接地用于監(jiān)控這些對象的狀態(tài)。輔助高速緩存數(shù)據(jù)的維護(hù):物化視圖(MATERIALIZEDVIEW)是這類應(yīng)用的實例。每當(dāng)物化視圖的基礎(chǔ)表發(fā)生改變時,與該基礎(chǔ)表相連的觸發(fā)器就會更新物化視圖。簡化應(yīng)用設(shè)計:將核心編程邏輯從異常處理中分離出來,可以相當(dāng)大地簡化某些應(yīng)用。若異常可以被模型化為數(shù)據(jù)庫中的更新操作,則觸發(fā)器是此類應(yīng)用的理想實現(xiàn)途徑。7.6.2觸發(fā)器結(jié)構(gòu)

SQLServer觸發(fā)器的語法如下:CREATETRIGGER觸發(fā)器名稱ON{table|view}[WITHENCRYPTION]{{{FOR|AFTER|INSTEADOF}{[INSERT][,][UPDATE][,][DELETE]}[WITHAPPEND][NOTFORREPLICATION]AS<SQL語句塊>}}7.6.2觸發(fā)器結(jié)構(gòu)

其中參數(shù)說明如下:table|view:是在其上執(zhí)行觸發(fā)器的表或視圖,有時稱為觸發(fā)器表或觸發(fā)器視圖??梢赃x擇是否指定表或視圖的所有者名稱。WITHENCRYPTION:加密Syscomments表中包含CREATETRIGGER語句文本的條目。AFTER:指定觸發(fā)器只有在觸發(fā)SQL語句中指定的所有操作都已成功執(zhí)行后才激發(fā)INSTEADOF:指定執(zhí)行觸發(fā)器而不是執(zhí)行觸發(fā)SQL語句,從而替代觸發(fā)語句的操作。DELETE,INSERT,UPDATE:指定在表或視圖上執(zhí)行哪些數(shù)據(jù)修改語句時將激活觸發(fā)器的關(guān)鍵字。必須至少指定一個選項。WITHAPPEND:指定應(yīng)該添加現(xiàn)有類型的其他觸發(fā)器。WITHAPPEND不能與INSTEADOF觸發(fā)器一起使用,或者如果顯式聲明AFTER觸發(fā)器,也不能使用該子句。NOTFORREPLICATION:表示當(dāng)復(fù)制進(jìn)程更改觸發(fā)器所涉及的表時,不應(yīng)執(zhí)行該觸發(fā)器。AS:是觸發(fā)器要執(zhí)行的操作。sql_statement:是觸發(fā)器的條件和操作。觸發(fā)器條件指定其他準(zhǔn)則,以確定DELETE、INSERT或UPDATE語句是否導(dǎo)致執(zhí)行觸發(fā)器操作。7.6.3觸發(fā)器編程

(1)創(chuàng)建觸發(fā)器

(2)修改觸發(fā)器修改觸發(fā)器的語句如下:ALTERTRIGGERtrigger_name

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論