ch9-服務(wù)器環(huán)境下的SQL_第1頁(yè)
ch9-服務(wù)器環(huán)境下的SQL_第2頁(yè)
ch9-服務(wù)器環(huán)境下的SQL_第3頁(yè)
ch9-服務(wù)器環(huán)境下的SQL_第4頁(yè)
ch9-服務(wù)器環(huán)境下的SQL_第5頁(yè)
已閱讀5頁(yè),還剩107頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、本章討論的問(wèn)題1在獨(dú)立運(yùn)用SQL言語(yǔ)進(jìn)展數(shù)據(jù)庫(kù)操作時(shí),這種運(yùn)用方法被稱為交互式SQL,交互式SQL的缺陷是只能進(jìn)展數(shù)據(jù)庫(kù)的操作,不能進(jìn)展數(shù)據(jù)處置。當(dāng)一個(gè)程序既要訪問(wèn)數(shù)據(jù)庫(kù)又要處置數(shù)據(jù)時(shí),把SQL言語(yǔ)嵌入到程序設(shè)計(jì)言語(yǔ)即宿主言語(yǔ)中,將SQL言語(yǔ)訪問(wèn)數(shù)據(jù)庫(kù)的功能和宿主言語(yǔ)的數(shù)據(jù)處置功能結(jié)合起來(lái)是目前常用的方法,以這種方式運(yùn)用的SQL被稱為嵌入式SQL。.本章討論的問(wèn)題2本章主要討論的就是如何把SQL運(yùn)用到一個(gè)完好的編程環(huán)境中。由于宿主言語(yǔ)編譯程序不能識(shí)別SQL言語(yǔ),如何將嵌有SQL言語(yǔ)的宿主言語(yǔ)程序編譯成可執(zhí)行代碼?宿主言語(yǔ)和DBMS之間如何傳送數(shù)據(jù)?數(shù)據(jù)庫(kù)的查詢結(jié)果普通是一些元組的集合,這些元組

2、必需賦值給宿主言語(yǔ)變量才干被宿主言語(yǔ)運(yùn)用。如何將元組賦給宿主言語(yǔ)的變量?DBMS和宿主言語(yǔ)的數(shù)據(jù)類型不完全對(duì)應(yīng),如何在兩者之間進(jìn)展必要而且合理的數(shù)據(jù)類型的轉(zhuǎn)換?.SQL的三種編程方式嵌入到宿主言語(yǔ)(常規(guī)程序設(shè)計(jì)言語(yǔ),如C)中關(guān)鍵問(wèn)題:SQL與環(huán)境變量/宿主言語(yǔ)之間如何交換數(shù)據(jù)存儲(chǔ)過(guò)程將SQL和被稱為耐久性存儲(chǔ)模塊的普統(tǒng)統(tǒng)用程序結(jié)合起來(lái),這些模塊是以數(shù)據(jù)庫(kù)方式方式存儲(chǔ)的代碼段,由用戶以命令的方式執(zhí)行調(diào)用級(jí)界面以常規(guī)言語(yǔ)編程,用函數(shù)庫(kù)來(lái)訪問(wèn)數(shù)據(jù)庫(kù),例如為了從C程序中調(diào)用,可以運(yùn)用稱為SQL/CLI的SQL規(guī)范庫(kù),Java的JDBC,或PHP等.主要內(nèi)容9.1 編程環(huán)境下的SQL9.2 方式中的存儲(chǔ)

3、過(guò)程9.3 SQL 環(huán)境9.4 運(yùn)用調(diào)用層接口9.5 SQL中的平安機(jī)制和用戶認(rèn)證.包含SQL語(yǔ)句的典型編程系統(tǒng)將包含宿主言語(yǔ)+嵌套SQL語(yǔ)句的程序提交給預(yù)處置器。預(yù)處置器將嵌套SQL語(yǔ)句轉(zhuǎn)化為調(diào)用函數(shù),此函數(shù)把SQL語(yǔ)句當(dāng)作字符串參數(shù),并且執(zhí)行這個(gè)SQL語(yǔ)句 經(jīng)過(guò)預(yù)處置的宿主言語(yǔ)程序隨后以通常的方式編譯.DBMS銷售商提供了必要的函數(shù)庫(kù),這樣實(shí)現(xiàn)SQL的函數(shù)被執(zhí)行,并且整個(gè)程序像一個(gè)整體一樣運(yùn)作。還有另一種方式:程序員用宿主言語(yǔ)編寫程序,在涉及到數(shù)據(jù)庫(kù)訪問(wèn)時(shí)直接運(yùn)用這些函數(shù)調(diào)用。這就是SQL編程的第3種方式“調(diào)用級(jí)界面/CLI.SQL與宿主言語(yǔ)之間的阻抗不匹配問(wèn)題SQL與編程言語(yǔ)的數(shù)據(jù)類型差

4、別非常大SQL:關(guān)系數(shù)據(jù)模型,不運(yùn)用指針、構(gòu)造體、循環(huán)和分支常規(guī)編程言語(yǔ):整型、實(shí)型、字符型、指針、記錄、數(shù)組無(wú)法直接表示集合因此,在SQL和常規(guī)編程言語(yǔ)之間不能直接轉(zhuǎn)移數(shù)據(jù)SQL與常規(guī)編程言語(yǔ)二者缺一不可SQL在很大程度上協(xié)助程序員編寫數(shù)據(jù)庫(kù)操作而很多重要任務(wù)(如算法實(shí)現(xiàn))又離不開常規(guī)編程言語(yǔ)必需設(shè)計(jì)一種機(jī)制(例如提供接口),允許程序的開發(fā)既可以運(yùn)用SQL,也可以運(yùn)用常規(guī)編程言語(yǔ)(宿主言語(yǔ)).SQL/宿主言語(yǔ)接口數(shù)據(jù)庫(kù)只能由SQL語(yǔ)句訪問(wèn),在SQL和宿主言語(yǔ)之間經(jīng)過(guò)宿主言語(yǔ)變量來(lái)傳送信息,可以用SQL語(yǔ)句讀或?qū)懰拗餮哉Z(yǔ)變量;數(shù)據(jù)庫(kù)和宿主言語(yǔ)程序之間實(shí)現(xiàn)信息交換的變量稱為共享變量SQL中對(duì)共享

5、變量的援用要加上冒號(hào)作為前綴在宿主言語(yǔ)中這些變量并不需求冒號(hào).共享變量的聲明 EXEC SQL BEGIN DECLARE SECTION; 共享變量的聲明 EXEC SQL END DECLARE SECTION;共享變量的聲明要放在DECLARE節(jié)中,聲明節(jié)中的變量聲明方式可以是宿主言語(yǔ)要求的任何方式。為使聲明的變量有意義,共享變量類型必需是宿主言語(yǔ)和SQL都可以處置的如整型、實(shí)型和字符型,或者數(shù)組類型聲明節(jié).例如9.3EXEC SQL BEGIN DECLARE SECTION; char studioName50,studioAddr256; char SQLSTATE6;EXEC S

6、QL END DECLARE SECTION;.運(yùn)用共享變量后面是嵌套的SQL語(yǔ)句共享變量在SQL中須加冒號(hào)作前綴.特殊變量SQLSTATE在SQL規(guī)范中,SQLSTATE這個(gè)特殊的變量由系統(tǒng)定義,用于銜接宿主言語(yǔ)程序與SQL執(zhí)行系統(tǒng)。SQLSTATE是五個(gè)字符的數(shù)組類型。每次調(diào)用SQL的庫(kù)函數(shù),向SQLSTATE變量中存放一個(gè)代碼,該代碼表示調(diào)用過(guò)程中出現(xiàn)的問(wèn)題。宿主言語(yǔ)程序可以讀出SQLSTATE的值并且基于該值做出判別。.SQLSTATE變量的值SQL規(guī)范同時(shí)指定了大量的五個(gè)字符的代碼和它們的意義。例如:00000: 沒有產(chǎn)生任何錯(cuò)誤02000:沒找到作為SQL查詢結(jié)果組成部分的元組。這

7、個(gè)代碼非常重要:它允許在宿主言語(yǔ)程序中創(chuàng)建一個(gè)循環(huán)并且每執(zhí)行一次循環(huán)檢查一個(gè)元組,當(dāng)關(guān)系中最后一個(gè)元組被檢查后中止該循環(huán)。21000:表示單元組選擇前往了多個(gè)元組.關(guān)鍵字EXEC SQL在宿主言語(yǔ)中運(yùn)用SQL語(yǔ)句時(shí),經(jīng)過(guò)SQL語(yǔ)句前面的關(guān)鍵字EXEC SQL提示預(yù)處置器將有SQL代碼進(jìn)入。系統(tǒng)將預(yù)處置這些語(yǔ)句,用宿主言語(yǔ)中適宜的函數(shù)調(diào)用來(lái)替代這些語(yǔ)句,并充分利用與SQL相關(guān)的函數(shù)庫(kù)。.SQL語(yǔ)句的嵌入任何不前往結(jié)果的SQL語(yǔ)句(即非查詢語(yǔ)句)都可以用EXEC SQL為前綴直接嵌入到宿主言語(yǔ)中包括INSERT、DELETE和UPDATE語(yǔ)句以及那些創(chuàng)建、修正或者刪除表和視圖等方式元素的語(yǔ)句。然而

8、由于“阻抗不匹配,select-from-where查詢不能直接嵌套到宿主言語(yǔ)。查詢產(chǎn)生的結(jié)果是元組包,但是大多數(shù)宿主言語(yǔ)均不直接支持集合或包數(shù)據(jù)類型。.查詢嵌入宿主言語(yǔ)的機(jī)制為了將查詢結(jié)果與宿主言語(yǔ)程序相銜接,嵌套SQL有兩種機(jī)制可選擇:(1) 單元組選擇語(yǔ)句:只需一個(gè)結(jié)果元組的查詢可將該元組存儲(chǔ)到共享變量中,一個(gè)變量對(duì)應(yīng)元組的一個(gè)分量。(2) 游標(biāo):當(dāng)查詢結(jié)果是多個(gè)元組,可以為查詢聲明一個(gè)游標(biāo),游標(biāo)范圍覆蓋結(jié)果關(guān)系中的一切元組,每個(gè)元組依次被提取到共享變量中,并由宿主言語(yǔ)進(jìn)展處置。.(1) 單元組選擇語(yǔ)句單元組選擇的方式類似于交互式SQL中的select-from-where語(yǔ)句,只是SE

9、LECT子句后緊跟著關(guān)鍵字INTO和一連串的共享變量(以冒號(hào)作為前綴)。假設(shè)查詢結(jié)果是個(gè)單一元組,那么這個(gè)元組的分量將分配給這些變量并成為它們的值。假設(shè)結(jié)果沒有元組或者多于一個(gè)元組,那么不會(huì)分配給這些共享變量,同時(shí)一個(gè)相應(yīng)的錯(cuò)誤碼被寫入到SQLSTATE變量中。.單元組選擇例如.(2) 游標(biāo) 游標(biāo)聲明 EXEC SQL DECLARE CURSOR FOR 其中查詢可以是通常的select-from-where查詢或者關(guān)系名。游標(biāo)范圍覆蓋該查詢產(chǎn)生的關(guān)系元組。 翻開游標(biāo) (初始化) EXEC SQL OPEN 初始化游標(biāo)的位置,使游標(biāo)指向其所覆蓋的關(guān)系中的第一個(gè)元組之前。.(2) 游標(biāo)(續(xù)1)

10、 fetch子句 EXEC SQL FETCH FROM INTO 將游標(biāo)向前推進(jìn)一個(gè)位置,然后按照游標(biāo)的當(dāng)前位置取一個(gè)元組,對(duì)共享變量進(jìn)展賦值。每個(gè)關(guān)系元組的屬性對(duì)應(yīng)列表里的一個(gè)變量。假設(shè)有一個(gè)可獲取的元組,那么該元組相應(yīng)的分量將賦值給對(duì)應(yīng)的變量。假設(shè)元組曾經(jīng)被遍歷過(guò)了,那么不會(huì)前往任何元組,且SQLSTATE被賦值為02000,表示“沒有發(fā)現(xiàn)任何元組。.(2) 游標(biāo)(續(xù)2) 封鎖游標(biāo) EXEC SQL CLOSE 游標(biāo)將不再覆蓋關(guān)系的元組。然而,游標(biāo)可由另外一條OPEN語(yǔ)句重新初始化,它將重新覆蓋這個(gè)關(guān)系的元組。.游標(biāo)例如P266例7.4 分別計(jì)算凈資產(chǎn)位數(shù)從1-14的出品人個(gè)數(shù).游標(biāo)更新

11、當(dāng)游標(biāo)遍歷一個(gè)根本表的元組時(shí),不僅可以讀和處置每個(gè)元組的值,也可以修正或者刪除當(dāng)前元組。這里的UPDATE和DELETE語(yǔ)句,要求其WHERE子句只能是WHERE CURRENT OF,其后跟著游標(biāo)的稱號(hào)。.P267例7.5 更新行政長(zhǎng)官的資產(chǎn)值,假設(shè)凈資產(chǎn)值少于1000那么刪除該元組,否那么將其凈資產(chǎn)值加倍。MovieExecs (name, address, cert#, netWorth)游標(biāo)更新例如.防止并發(fā)更新不希望游標(biāo)讀取的元組被并發(fā)的變化所影響對(duì)游標(biāo)所讀取關(guān)系進(jìn)展修正的語(yǔ)句,在游標(biāo)讀取元組前就已徹底完成或在游標(biāo)讀取元組后再運(yùn)轉(zhuǎn)為了保證這一點(diǎn),對(duì)于并發(fā)變化可以將游標(biāo)聲明為對(duì)并發(fā)修正

12、不敏感(insensitive)。例如: EXEC SQL DECLARE execCursor INSENSITIVE CURSOR FOR SELECT netWorth FROM MovieExec ;保證在execCursor翻開和封鎖之間,對(duì)關(guān)系MovieExec所作的變化不會(huì)影響游標(biāo)提取到的元組集合。.將游標(biāo)聲明為READ ONLY假設(shè)知關(guān)系R上的一個(gè)游標(biāo)不會(huì)改動(dòng)R,那么該游標(biāo)可與R的其他不敏感游標(biāo)同時(shí)運(yùn)轉(zhuǎn)。將游標(biāo)聲明為FOR READ ONLY,那么數(shù)據(jù)庫(kù)系統(tǒng)可以保證根本關(guān)系R不會(huì)由于讀取游標(biāo)而修正了關(guān)系R。 EXEC SQL DECLARE execCursor CURSOR

13、FOR SELECT netWorth FROM MovieExec FOR READ ONLY;這樣,任何試圖經(jīng)過(guò)游標(biāo)execCursor所做出的關(guān)系修正都會(huì)產(chǎn)生錯(cuò)誤。.卷型游標(biāo)SCROLL游標(biāo)同時(shí)提供了遍歷關(guān)系中元組的順序選擇缺省選擇是從關(guān)系頂端開場(chǎng),依次提取元組直至末尾(最常用)。也可以經(jīng)過(guò)定義卷型游標(biāo)按別的順序提取元組。為了可以按其他順序提取元組,有2個(gè)步驟:聲明游標(biāo)時(shí),將關(guān)鍵字SCROLL置于保管字CURSOR之前。通知SQL系統(tǒng),游標(biāo)的運(yùn)用方式不只是按照元組順序向前挪動(dòng)。 FETCH語(yǔ)句中,關(guān)鍵字FETCH后面的選項(xiàng)決議所期望的元組的位置。.FETCH選項(xiàng)NEXT|PRIOR: 按

14、順序提取相對(duì)于游標(biāo)當(dāng)前位置的下一個(gè)|上一個(gè)元組。NEXT為默許值。FIRST|LAST: 提取第一個(gè)|最后一個(gè)元組RELATIVE n: n為正|負(fù)整數(shù)。相對(duì)游標(biāo)當(dāng)前位置向前(n為正整數(shù))|向后(n為負(fù)整數(shù))挪動(dòng)n個(gè)元組。 RELATIVE 1即NEXT, RELATIVE -1即PRIORABSOLUTE n: n為正|負(fù)整數(shù)。從頭部(n為正整數(shù))|尾部(n為負(fù)整數(shù))挪動(dòng)n個(gè)元組。 ABSOLUTE 1即FIRST , ABSOLUTE -1即LAST.卷型游標(biāo)例如EXEC SQL DECLARE execCursor SCROLL CURSOR FOR MovieExec;EXEC SQL

15、 OPEN execCursor;EXEC SQL FETCH LAST FROM execCursor INTO :execName, :execAddr, :certNo, :worth;While(1) EXEC SQL FETCH PRIOR FROM execCursor INTO :execName, :execAddr, :certNo, :worth;.動(dòng)態(tài)SQL 嵌入式SQL有兩種主要的方式:靜態(tài)的SQL和動(dòng)態(tài)的SQL。靜態(tài)的SQL語(yǔ)句是在編寫程序時(shí)要定義一切的SQL語(yǔ)句,如INSERT、SELECT等普通的SQL語(yǔ)句。但很多情況下,SQL語(yǔ)句或SQL所帶的參數(shù)在編譯時(shí)并不知

16、道,運(yùn)用必需在運(yùn)轉(zhuǎn)時(shí)才干生成SQL語(yǔ)句,這種在運(yùn)轉(zhuǎn)時(shí)才干生成的SQL語(yǔ)句叫動(dòng)態(tài)SQL語(yǔ)句。對(duì)于動(dòng)態(tài)SQL,SQL語(yǔ)句可以被運(yùn)用程序在運(yùn)轉(zhuǎn)時(shí)構(gòu)造。.假設(shè)在預(yù)編譯時(shí)以下信息不能確認(rèn),就必需運(yùn)用動(dòng)態(tài)SQL技術(shù): 1SQL語(yǔ)句正文 2主變量個(gè)數(shù) 3主變量的數(shù)據(jù)類型 4SQL語(yǔ)句中援用的數(shù)據(jù)對(duì)象例如,列、根本表、視圖等 動(dòng)態(tài)SQL方法允許在程序運(yùn)轉(zhuǎn)過(guò)程中暫時(shí)“組裝SQL語(yǔ)句,主要有三種方式:1語(yǔ)句可變:允許用戶在程序運(yùn)轉(zhuǎn)時(shí)暫時(shí)輸入完好的SQL語(yǔ)句。2條件可變:對(duì)于查詢語(yǔ)句,SELECT子句是確認(rèn)的,即語(yǔ)句的輸出是確定的,其他子句如Where子句、Having短語(yǔ)有一定的可變性。3數(shù)據(jù)庫(kù)對(duì)象,查詢條件均可

17、變:對(duì)于查詢語(yǔ)句,Select子句的列名、From子句中的表名或視圖名、Where子句和Having短語(yǔ)中的條件均可由用戶暫時(shí)構(gòu)造,即語(yǔ)句的輸入和輸出能夠都是不確定的。.與之相關(guān)的動(dòng)態(tài)定義語(yǔ)句簡(jiǎn)要引見如下:PREPARE語(yǔ)句:將一字符串解釋成一組SQL語(yǔ)句,并賦給它一個(gè)語(yǔ)句標(biāo)識(shí)符,以后的動(dòng)態(tài)管理語(yǔ)句經(jīng)過(guò)語(yǔ)句標(biāo)識(shí)來(lái)援用這組SQL語(yǔ)句。PREPARE語(yǔ)句的普通方式為: PREPARE 語(yǔ)句標(biāo)識(shí)名 from “SQL語(yǔ)句 或 PREPARE 語(yǔ)句標(biāo)識(shí)名 from :宿主變量;EXECUTE語(yǔ)句:運(yùn)轉(zhuǎn)與其語(yǔ)句標(biāo)識(shí)符對(duì)應(yīng)的事先預(yù)備好的語(yǔ)句,對(duì)非select語(yǔ)句,用EXECUTE來(lái)運(yùn)轉(zhuǎn)。 EXECUTE語(yǔ)

18、句的普通方式為: EXECUTE 被預(yù)備的語(yǔ)句標(biāo)識(shí)名using宿主變量列3. EXECUTE IMMEDIATE語(yǔ)句:立刻執(zhí)行語(yǔ)句,它接納一字符串,將其解釋成SQL語(yǔ)句并立刻執(zhí)行它,然后釋放預(yù)備SQL語(yǔ)句所占用的資源。.4. DECLARE語(yǔ)句:為已預(yù)備好的select語(yǔ)句闡明游標(biāo)。5. FREE語(yǔ)句:釋放已預(yù)備好的語(yǔ)句或已翻開的游標(biāo)所占用的資源6. DESCRIBE語(yǔ)句:確定已預(yù)備好的語(yǔ)句能否為select語(yǔ)句,假設(shè)是,那么得到單一查找行的存儲(chǔ)要求,否那么只前往語(yǔ)句類型。.動(dòng)態(tài)SQL的特性為:語(yǔ)句的闡明與執(zhí)行分為兩步。第一步,PREPARE語(yǔ)句用于分析SQL語(yǔ)句,并且在必要時(shí)建立一個(gè)程序方案

19、;第二步,用EXECUTE或定義游標(biāo)來(lái)執(zhí)行被預(yù)備好的SQL語(yǔ)句。這樣一旦一條SQL語(yǔ)句經(jīng)過(guò)預(yù)備處置后,就可反復(fù)執(zhí)行它多次。參與僅執(zhí)行一次的SQL語(yǔ)句那就不用做預(yù)備處置。.動(dòng)態(tài)SQL執(zhí)行的兩個(gè)步驟1. 讀入字符串并轉(zhuǎn)換成可執(zhí)行的SQL語(yǔ)句 EXEC SQL PREPARE V FROM V是SQL變量,是其值為字符串的恣意一條宿主言語(yǔ)表達(dá)式。宿主言語(yǔ)程序指點(diǎn)SQL系統(tǒng)接受剛讀到的字符串,經(jīng)語(yǔ)法分析后將其轉(zhuǎn)化為可執(zhí)行SQL語(yǔ)句, 用V表示2. 執(zhí)行該SQL語(yǔ)句 EXEC SQL EXECUTE V執(zhí)行V所代表的SQL語(yǔ)句。.上述兩個(gè)步驟也可以合二為一 EXEC SQL EXECUTE IMMEDI

20、ATE 假設(shè)一條語(yǔ)句被編譯一次,然后執(zhí)行很多次時(shí),就會(huì)看到合并這兩步是不利的。運(yùn)用EXECUTE IMMEDIATE ,每次語(yǔ)句執(zhí)行時(shí)都要付出預(yù)備該語(yǔ)句的代價(jià),而不是只付出一次。.動(dòng)態(tài)SQL例如既然查詢只執(zhí)行一次,那么6)7)可替代為:EXEC SQL EXECUTE IMMEDIATE:query.本節(jié)習(xí)題機(jī)械三 P233 清華版 P271 9.3.1 (a) (d) 7.1.1 (a) (d) (f)(f) 使一切“舊PC的價(jià)風(fēng)格低$100。要確保在他的程序運(yùn)轉(zhuǎn)期間插入的任何“新PC的價(jià)錢不會(huì)調(diào)低。7.1.3 請(qǐng)運(yùn)用滾動(dòng)游標(biāo)找出如下關(guān)系中滿足條件的一切PC。PC (model, speed

21、, ram, hd, cd, price)條件是:至少有兩種速度一樣而價(jià)錢更貴的PC。提示:讀取先按速度再按價(jià)錢排序的PC的元組,對(duì)于每個(gè)讀出的元組,往前跳兩個(gè)元組看看速度能否沒變。.主要內(nèi)容9.1 編程環(huán)境下的SQL9.2 方式中的存儲(chǔ)過(guò)程9.3 SQL 環(huán)境9.4 運(yùn)用調(diào)用層接口9.5 SQL中的平安機(jī)制和用戶認(rèn)證.耐久性存儲(chǔ)模塊Persistent Stored Modules: SQL/PSM(簡(jiǎn)寫為PSM)第二種結(jié)合SQL與通用程序設(shè)計(jì)言語(yǔ)的編程方法,允許用簡(jiǎn)單通用的言語(yǔ)編寫過(guò)程并且將它們存儲(chǔ)在數(shù)據(jù)庫(kù)中,作為方式的一部分,稱為PSM。這些過(guò)程可以在數(shù)據(jù)庫(kù)中完成不能用SQL單獨(dú)完成的處

22、置。 每個(gè)商用性的DBMS均向用戶提供了本身的PSM擴(kuò)展,本書中引見的是SQL/PSM規(guī)范,描畫了這些擴(kuò)展功能的主要思想。.PSM模塊PSM中定義了模塊 (modules),該模塊是如下內(nèi)容的集合:函數(shù)和過(guò)程定義暫時(shí)關(guān)系聲明其他可選聲明.1. 創(chuàng)建PSM函數(shù)和過(guò)程PSM過(guò)程的聲明創(chuàng)建過(guò)程的保管字CREATE PROCEDUREPSM過(guò)程的參數(shù)是方式前綴-參數(shù)名-參數(shù)類型三元組方式前綴為IN|OUT|INOUT。這三個(gè)關(guān)鍵字分別闡明參數(shù)是僅輸入的|僅輸出的|既可輸入又可輸出的。缺省前綴是IN,可省略。CREATE PROCEDURE () 可選的部分變量聲明 定義過(guò)程的可執(zhí)行的代碼體.創(chuàng)建PSM

23、函數(shù)和過(guò)程PSM函數(shù)的聲明函數(shù)定義與過(guò)程定義的不同之處 運(yùn)用保管字FUNCTION; 必需指定前往值的類型 RETURN; 函數(shù)的參數(shù)只可以是IN方式。換句話說(shuō),PSM阻止了函數(shù)中的副作用,從函數(shù)中得到信息的獨(dú)一方式是經(jīng)過(guò)函數(shù)的前往值。 在過(guò)程定義中常指出IN方式,但函數(shù)參數(shù)中不指明CREATE FUNCTION () RETURNS .存儲(chǔ)過(guò)程例如存儲(chǔ)過(guò)程中SQL語(yǔ)句的限制:只允許查詢進(jìn)展單元組選擇語(yǔ)句和基于游標(biāo)的訪問(wèn)。PSM過(guò)程將新舊兩個(gè)地址作為其參數(shù),并且用新地址交換MovieStar中每一個(gè)舊地址。變量類型與MovieStar方式定義中address的類型相匹配參數(shù)名可作常量,PSM過(guò)

24、程和函數(shù)中的參數(shù)或別的部分變量不要求加冒號(hào).2. PSM中的簡(jiǎn)單語(yǔ)句格式調(diào)用語(yǔ)句前往語(yǔ)句部分變量聲明賦值語(yǔ)句語(yǔ)句組語(yǔ)句標(biāo)號(hào).(1) 過(guò)程調(diào)用的語(yǔ)句 CALL ()調(diào)用語(yǔ)句在不同的地方運(yùn)用不同的方式:宿主言語(yǔ)中的調(diào)用方式:EXEC SQL CALL Foo( :x, 3);作為另一個(gè)PSM函數(shù)或過(guò)程的語(yǔ)句作為發(fā)送給根本SQL界面的SQL命令例如:把語(yǔ)句CALL Foo(1,3);發(fā)送給該界面,并分別用 1和3作為賦值過(guò)程的兩個(gè)參數(shù),然后執(zhí)行存儲(chǔ)過(guò)程Foo在PSM中調(diào)用函數(shù)應(yīng)運(yùn)用函數(shù)名和匹配的參數(shù)作為表達(dá)式的一部分。.(2) 前往語(yǔ)句 RETURN ;該語(yǔ)句只能出如今函數(shù)中。它計(jì)算表達(dá)式的值,并將

25、函數(shù)的前往值設(shè)置為該計(jì)算結(jié)果。和普通編程言語(yǔ)不同的是:PSM的前往語(yǔ)句不終了這個(gè)函數(shù)。甚至,它將繼續(xù)控制后面的語(yǔ)句,而且在函數(shù)完成之前前往值都能夠會(huì)改動(dòng)。.(3) 部分變量聲明 DECLARE ;用給定的類型聲明給定稱號(hào)的變量。這個(gè)變量是部分的,在函數(shù)或者過(guò)程運(yùn)轉(zhuǎn)后,DBMS不再保管其值。函數(shù)或過(guò)程體中的部分變量聲明必需在可執(zhí)行語(yǔ)句之前.(4) 賦值語(yǔ)句 SET =;除了引導(dǎo)保管字SET外,PSM中的賦值和別的言語(yǔ)完全類似。計(jì)算等號(hào)右邊表達(dá)式的值,將其賦值給左邊的變量。表達(dá)式可以是NULL,甚至可以是查詢,只需該查詢是前往一個(gè)單值。.(5) 語(yǔ)句組語(yǔ)句組以分號(hào)終了,并置于保管字BEGIN和EN

26、D之間。這種構(gòu)造被當(dāng)作單個(gè)語(yǔ)句,可以出如今任何單個(gè)語(yǔ)句可以出現(xiàn)的地方。特別是,由于過(guò)程或函數(shù)體相當(dāng)于單個(gè)語(yǔ)句,所以在過(guò)程和函數(shù)體中可插入任何語(yǔ)句序列,只需它們被置于BEGIN和END之間。.(6) 語(yǔ)句標(biāo)號(hào)語(yǔ)句標(biāo)號(hào):用名字(標(biāo)號(hào)名)和冒號(hào)作為前綴來(lái)標(biāo)識(shí)語(yǔ)句。.3. 分支語(yǔ)句(IF語(yǔ)句)其方式與C和其他類似言語(yǔ)的不同是:用保管字END IF終了嵌套在IF語(yǔ)句中的ELSE子句以單詞ELSEIF開場(chǎng)可選任何布爾類型的表達(dá)式語(yǔ)句列表由以分號(hào)終了的語(yǔ)句構(gòu)成,但不用置于BEGINEND之間.課本例如編寫一個(gè)關(guān)于年份y和電影公司s的函數(shù),它前往一個(gè)布爾值,其值為TRUE當(dāng)且僅當(dāng)電影公司s在第y年至少制造了一

27、部喜劇電影,或其該年沒有制造任何電影.4. PSM中的select-from-where查詢方式(1)子查詢可用于條件語(yǔ)句中,或者普通而言,在SQL中任何地方運(yùn)用子查詢都是合法的。.4. PSM中的select-from-where查詢方式(2)前往單一值的查詢可用在賦值語(yǔ)句的右邊。(3)PSM中單元組選擇語(yǔ)句是合法語(yǔ)句。INTO子句將變量賦值為單個(gè)前往元組的分量。這些變量可以是部分變量或PSM過(guò)程的參數(shù)。SET presNetWorth=(SELECT netWorth FROM Studio,MovieExec WHERE presC#=cert# AND S=studioName);.4

28、. PSM中的select-from-where查詢方式(4)聲明和運(yùn)用游標(biāo)。下面幾點(diǎn)是不同的:語(yǔ)句中不出現(xiàn)EXEC SQL部分變量不運(yùn)用冒號(hào)前綴運(yùn)用游標(biāo)的例子將被延遲到下一節(jié)學(xué)習(xí)了PSM循環(huán)語(yǔ)句之后.5. PSM中的LOOP循環(huán) LOOP END LOOP;假設(shè)對(duì)LOOP語(yǔ)句設(shè)置循環(huán)標(biāo)識(shí),可運(yùn)用下面的語(yǔ)句中斷循環(huán): LEAVE ;循環(huán)中可用游標(biāo)讀取元組,當(dāng)沒有更多元組時(shí),就希望分開這個(gè)循環(huán)。對(duì)于表示沒有找到元組的SQLSTATE值( 02000),可以定義一個(gè)條件名: DECLARE Not_Found CONDITION FOR SQLSTATE 02000;更普通地,可以用如下語(yǔ)句聲明表

29、示任何希望與SQLSTATE值相對(duì)應(yīng)的標(biāo)識(shí)作為條件: DECLARE CONDITION FOR SQLSTATE ;.PSM循環(huán)例如本例的PSM過(guò)程將電影公司稱號(hào)s作為輸入?yún)?shù),并且用輸出參數(shù)mean和variance給出電影公司s擁有的一切電影長(zhǎng)度的平均值和方差。 均值的定義: 方差的定義: 方差計(jì)算公式: .6.PSM中的FOR循環(huán)PSM中的FOR循環(huán)構(gòu)造,獨(dú)一重要的目的是游標(biāo)的迭代。.FOR循環(huán)例如.PSM中的其他循環(huán) PSM中也有while和repeat循環(huán),其含義與C一樣。也就是說(shuō),可以創(chuàng)建如下方式的循環(huán) WHILEDO END WHILE;或者這種方式的循環(huán): REPEAT UN

30、TIL END REPEAT;.7. PSM中的異常處置SQL系統(tǒng)經(jīng)過(guò)在SQLSTATE變量中設(shè)置非零數(shù)字序列來(lái)闡明錯(cuò)誤條件。例如:02000表示“沒有找到元組 21000表示單元組選擇前往了多個(gè)元組PSM可以聲明稱為異常處置的代碼。即在語(yǔ)句或語(yǔ)句組執(zhí)行過(guò)程中,當(dāng)錯(cuò)誤代碼列表中的任何一個(gè)出如今SQLSTATE中時(shí),就調(diào)用異常處置。.異常處置的組成每一個(gè)異常處置都和一個(gè)由BEGINEND描畫的代碼塊有關(guān)。處置過(guò)程出如今代碼塊中,并且僅僅針對(duì)代碼塊中的語(yǔ)句。異常處置的組成一組異常條件:當(dāng)這些條件成立時(shí)調(diào)用異常處置當(dāng)異常發(fā)生時(shí),與該異常相關(guān)聯(lián)的執(zhí)行代碼指明處置器完成處置后的轉(zhuǎn)移去處。.異常處置聲明的

31、方式DECLARE HANDLER FOR 轉(zhuǎn)移方式有3種選擇:CONTINUE:表示執(zhí)行異常處置聲明中的語(yǔ)句之后,繼續(xù)執(zhí)行產(chǎn)生異常的語(yǔ)句之后的語(yǔ)句。EXIT:表示執(zhí)行異常處置語(yǔ)句后,控制分開聲明異常處置的BEGINEND塊,下一步執(zhí)行該代碼塊之后的語(yǔ)句。UNDO:與EXIT差不多,區(qū)別在于到目前為止,已執(zhí)行的該塊語(yǔ)句對(duì)數(shù)據(jù)庫(kù)或部分變量產(chǎn)生的變化都被吊銷由逗號(hào)分隔的條件列表,可以是被聲明的條件,也可以是SQLSTATE和5位字符串的表達(dá)式。.異常例如編寫一個(gè)PSM函數(shù),以電影片名作為參數(shù),前往電影的年份。假設(shè)該片名的電影不存在或是不止一個(gè)的 話,那么前往NULL。.8. 運(yùn)用PSM函數(shù)和過(guò)程在

32、嵌套的SQL程序、PSM代碼本身或提供應(yīng)根本界面的普通SQL命令中都可調(diào)用PSM函數(shù)和過(guò)程用保管字CALL作為前綴來(lái)調(diào)用過(guò)程函數(shù)作為表達(dá)式的一部分出現(xiàn).運(yùn)用PSM函數(shù)和過(guò)程的例如假定方式中包括了具有GetYear函數(shù)的模塊。想象面對(duì)根本界面,預(yù)備輸入Denzel Washington是Remember the Titans中的影星這個(gè)現(xiàn)實(shí)。但卻忘記了電影年份。只需這個(gè)稱號(hào)的電影只需一部,并且它在關(guān)系Movies中,那么就不用經(jīng)過(guò)預(yù)先查詢?nèi)フ页鲈撃攴荨6?,可以將下面的語(yǔ)句插入到根本SQL界面中:.P241 習(xí)題9.4.1 在電影數(shù)據(jù)庫(kù)上用PSM過(guò)程或函數(shù)完成以下義務(wù): Movies (titl

33、e, year, length, genre, studioName, producerC#) StarsIn (movieTitle, movieYear, starName) MovieStar (name, address, gender, birthdate) MovieExecs (name, address, cert#, netWorth) Studio (name, address, presC#)a)給定電影公司的稱號(hào),計(jì)算其制片經(jīng)理的凈產(chǎn)值。c)給定電影公司稱號(hào),將該電影公司的兩部最長(zhǎng)的電影片名作為參數(shù)輸出。假設(shè)沒有這樣的電影那么參數(shù)中的一個(gè)或兩個(gè)被賦值為NULL(例如,假

34、設(shè)電影公司只需一部電影,那么沒有“第二長(zhǎng)的電影)。d)給定一個(gè)影星的名字,找出由他出演的時(shí)間超越120分鐘的最早的電影。假設(shè)沒有這樣的電影,那么前往年份0 .主要內(nèi)容9.1 編程環(huán)境下的SQL9.2 方式中的存儲(chǔ)過(guò)程9.3 SQL 環(huán)境9.4 運(yùn)用調(diào)用層接口9.5 SQL中的平安機(jī)制和用戶認(rèn)證.什么是SQL環(huán)境SQL環(huán)境是SQL中數(shù)據(jù)所在的框架,該框架下可以存儲(chǔ)數(shù)據(jù)、并對(duì)數(shù)據(jù)進(jìn)展SQL操作,可以看做安裝并運(yùn)轉(zhuǎn)在某些系統(tǒng)上的DBMS。數(shù)據(jù)庫(kù)的一切元素,包括表、視圖、觸發(fā)器等,都是在SQL環(huán)境中定義的。這些元素組成了層次性構(gòu)造:方式目錄簇.1. 方式指“數(shù)據(jù)庫(kù)方式而非“關(guān)系方式,是組織的根本單元。

35、方式是表、視圖、斷言、觸發(fā)器等數(shù)據(jù)庫(kù)元素的集合。方式聲明的方式:CREATE SCHEMA 方式聲明例如7.19.1. 方式(續(xù))CREATE SCHEMA 提供了在SQL語(yǔ)句中創(chuàng)建表、視圖以及授予對(duì)象權(quán)限的方法;不同方式的方式元素可以重名,可用“方式名.方式元素名來(lái)援用某個(gè)方式元素。沒有必要一次就聲明完一切的方式??梢赃\(yùn)用適宜的CREATE、DROP或ALTER語(yǔ)句來(lái)修正或添加方式運(yùn)用SET SCHEMA語(yǔ)句改動(dòng)“當(dāng)前的方式。 例如: SET SCHEMA MovieSchema ; 將使例7.19描畫的方式作為當(dāng)前方式.2. 目錄方式的集合,方式的創(chuàng)建和修正都在目錄中。每個(gè)目錄有一個(gè)或多個(gè)

36、方式,目錄中的方式名必需獨(dú)一,每個(gè)目錄包含一個(gè)叫IMFORMATION_SCHEMA的特殊方式,這個(gè)方式包含了該目錄中一切方式的信息。設(shè)置當(dāng)前目錄的語(yǔ)句: SET CATALOG ;對(duì)方式的操作(新建/修正方式等)都是針對(duì)當(dāng)前目錄.數(shù)據(jù)庫(kù)方式元素的全名 . . 例如:目錄MovieCatalog中的方式MovieSchema的表Movies的援用如下:MovieCatalog . MovieSchema . Movies假設(shè)目錄是缺省的或是當(dāng)前的目錄,那么可省去目錄名假設(shè)方式也是缺省的或當(dāng)前的方式,那么方式部分也可以省去,這樣只留下元素本人的稱號(hào)。然而,當(dāng)需求訪問(wèn)當(dāng)前方式或目錄以外的元素時(shí),就

37、不得不運(yùn)用完全名。.3. 簇簇是目錄的集合。每個(gè)用戶有一個(gè)關(guān)聯(lián)的簇,是用戶可訪問(wèn)的一切目錄的集合。簇是被提交的查詢的最大范圍,故在一定程度上,簇是特定用戶所看到的“數(shù)據(jù)庫(kù)。.SQL環(huán)境中的客戶和效力器按照SQL規(guī)范,SQL環(huán)境有兩種特殊的進(jìn)程:SQL 效力器:支持對(duì)數(shù)據(jù)庫(kù)元素的操作,充任數(shù)據(jù)庫(kù)效力器的角色。SQL客戶程序:允許用戶銜接到效力器上,對(duì)數(shù)據(jù)庫(kù)進(jìn)展操作。 例如:效力器運(yùn)轉(zhuǎn)在一個(gè)大的存儲(chǔ)數(shù)據(jù)庫(kù)的主機(jī)上,而客戶程序運(yùn)轉(zhuǎn)在其他主機(jī)上,也許是遠(yuǎn)離效力器的個(gè)人任務(wù)站,也許是和效力器運(yùn)轉(zhuǎn)在同一臺(tái)主機(jī)上。SQL的客戶程序和效力器通常與銜接、會(huì)話和模塊這三個(gè)概念嚴(yán)密地聯(lián)絡(luò)在一同。.銜接銜接是指將客戶

38、端和效力器銜接起來(lái)。假設(shè)在SQL客戶端主機(jī)上運(yùn)轉(zhuǎn)包含SQL的程序,那么可經(jīng)過(guò)CONNECT語(yǔ)句翻開客戶端和效力器間的銜接: CONNECT TO AS AUTHORIZATION 依賴于安裝??捎梅Q號(hào)DEFAULT將用戶銜接到任何被作為“缺省效力器安裝的SQL效力器。AUTHORIZATION授權(quán)子句后跟隨著用戶名和密碼,提供應(yīng)效力器進(jìn)展驗(yàn)證。可在以后用于援用銜接。緣由是SQL允許用戶翻開好幾個(gè)銜接,但任何時(shí)候只需一個(gè)銜接有效。.援用銜接任何當(dāng)前有效的銜接進(jìn)入休眠形狀后,只需用SET CONNECTION語(yǔ)句顯式地調(diào)用才干將其激活; SET CONNECTION conn1;運(yùn)用DISCONN

39、ECT語(yǔ)句斷開銜接時(shí)conn1被中止不是休眠,不能再被激活: DISCONNECT conn1; 注:假設(shè)銜接創(chuàng)建后再也不被援用,CONNECT TO子句中的AS和銜接名可以省略。.會(huì)話當(dāng)銜接激活時(shí),所執(zhí)行的SQL操作將在客戶端和效力器之間構(gòu)成懇求-呼應(yīng)式的交互,我們稱這樣的操作序列為一個(gè)會(huì)話Session。會(huì)話和創(chuàng)建它的銜接處于同一形狀,例如:當(dāng)銜接處于休眠形狀時(shí),它的會(huì)話也處于休眠形狀SET CONNECTION語(yǔ)句可激活銜接,同時(shí)激活相應(yīng)會(huì)話。每個(gè)會(huì)話有一個(gè)當(dāng)前目錄和該目錄中的一個(gè)當(dāng)前方式由語(yǔ)句SET SCHEMA和SET CATALOG進(jìn)展設(shè)置每個(gè)會(huì)話都有一個(gè)授權(quán)用戶.模塊SQL操作代

40、碼SQL2規(guī)范建議SQL實(shí)現(xiàn)至少為用戶提供如下三種類型的運(yùn)用程序稱為模塊之一:通用SQL接口:這種類型就是交互式SQL,在這種方式下用戶可以輸入由SQL效力器執(zhí)行的SQL語(yǔ)句,每個(gè)查詢或其他操作都是獨(dú)立的模塊。嵌入式SQL:在這種方式下,SQL語(yǔ)句出如今宿主言語(yǔ)程序中,并有EXEC SQL引導(dǎo)。經(jīng)過(guò)預(yù)處置程序把嵌入式SQL言語(yǔ)轉(zhuǎn)換為適于SQL系統(tǒng)的函數(shù)調(diào)用,編譯好的宿主言語(yǔ)程序執(zhí)行到相應(yīng)的函數(shù)語(yǔ)句時(shí)將調(diào)用相應(yīng)的函數(shù)。實(shí)踐模塊:含有存儲(chǔ)函數(shù)或過(guò)程集合的模塊。這些函數(shù)|過(guò)程部分是宿主言語(yǔ)代碼,部分是SQL語(yǔ)句,它們之間可經(jīng)過(guò)參數(shù)或共享變量進(jìn)展通訊。.SQL客戶端-效力器交互模塊的執(zhí)行被稱為SQL代

41、理;模塊是代碼,SQL代理是代碼的執(zhí)行;模塊和SQL代理作為一個(gè)整體,經(jīng)過(guò)訪問(wèn)SQL客戶端建立與數(shù)據(jù)庫(kù)的銜接。.三層體系構(gòu)造圖.三層體系構(gòu)造(1) Web效力器:可以解析HTTP協(xié)議。當(dāng)Web效力器接納到一個(gè)HTTP懇求,會(huì)前往一個(gè)HTTP呼應(yīng),例如送回一個(gè)HTML頁(yè)面。(2) 運(yùn)用效力器:經(jīng)過(guò)各種協(xié)議(可以包括HTTP),提供訪問(wèn)商業(yè)邏輯的途徑,供客戶端運(yùn)用程序運(yùn)用(3) 數(shù)據(jù)庫(kù)效力器:運(yùn)轉(zhuǎn)DBMS并執(zhí)行運(yùn)用效力器懇求的查詢和更新.三層體系構(gòu)造的解釋假設(shè)他訪問(wèn)的網(wǎng)頁(yè)只需象HTML這種頁(yè)面的,用WEB效力器就夠了但是假設(shè)是JSP,也就是含JAVA代碼的HTML,那么就需求JAVA運(yùn)用效力器了,

42、由于只需JAVA運(yùn)用效力器才干解析JSP里的JAVA代碼,并將解析結(jié)果以HTML的格式前往。.主要內(nèi)容9.1 編程環(huán)境下的SQL9.2 方式中的存儲(chǔ)過(guò)程9.3 SQL 環(huán)境9.4 運(yùn)用調(diào)用層接口9.5 SQL中的平安機(jī)制和用戶認(rèn)證.授權(quán)ID本節(jié)首先學(xué)習(xí)SQL允許對(duì)數(shù)據(jù)庫(kù)元素進(jìn)展哪些授權(quán)、然后學(xué)慣用戶如何獲得授權(quán)( 即授權(quán)ID) 、最后如何授權(quán);SQL假定存在授權(quán)ID,這些ID根本上都是用戶名 SQL有一個(gè)特殊的授權(quán)ID,稱作PUBLIC,它包含了一切用戶。授權(quán)ID可以被授予權(quán)限.1. 權(quán)限SQL中定義了九種類型的權(quán)限:SELECT、INSERT、DELETE、UPDATE:運(yùn)用于關(guān)系的查詢、插

43、入、刪除、更新的權(quán)益;REFERENCE:在完好性約束下援用關(guān)系的權(quán)益。約束可以是第7章引見的斷言、基于屬性或元組的檢查、或援用完好性約束等;USAGE:主要運(yùn)用在關(guān)系和斷言之外的其他方式元素上,給出了在聲明中運(yùn)用域等其他方式元素的權(quán)益TRIGGER:定義這個(gè)關(guān)系上的觸發(fā)器的權(quán)益EXECUTE:執(zhí)行如PSM過(guò)程|函數(shù)之類代碼的權(quán)益UNDER:創(chuàng)建給定類型的子類型的權(quán)益.權(quán)限例如思索以下插入語(yǔ)句所需的權(quán)限擁有關(guān)系Studio的INSERT或INSERT (name)權(quán)限擁有關(guān)系Movie的SELECT或SELECT (studioName)權(quán)限擁有關(guān)系Studio的SELECT或SELECT (

44、name)權(quán)限其他屬性分量上只能接受缺省值或NULL.2. 創(chuàng)建權(quán)限獲得權(quán)限有兩個(gè)方面需求明確創(chuàng)建權(quán)限:權(quán)限最初是如何創(chuàng)建的授權(quán):權(quán)限如何從一個(gè)用戶傳送到另一個(gè)用戶.SQL元素(如方式或模塊)都有一個(gè)屬主。屬主擁有其所屬事物的一切權(quán)限。創(chuàng)建權(quán)限的關(guān)鍵在于如何獲得屬主身份。在SQL中建立屬主身份有三種情況:方式創(chuàng)建時(shí),該方式及其一切方式元素的一切權(quán)都屬于其創(chuàng)建者。該用戶擁有方式元素一切能夠權(quán)限會(huì)話被CONNECT語(yǔ)句初始化時(shí),可用AUTHORIZATION子句指定用戶。模塊SQL操作代碼創(chuàng)建時(shí),可經(jīng)過(guò)AUTHORIZATION子句選擇其屬主例如:CONNECT TO Starfleet-sql-

45、server AS conn1 AUTHORIZATION kirk;用戶kirk創(chuàng)建了一個(gè)銜接到名為Starfleet-sql-server的SQL效力器的鏈路conn1 。在SQL的實(shí)現(xiàn)中還將驗(yàn)證用戶名能否有效,例如經(jīng)過(guò)訊問(wèn)密碼。也可將密碼包含在AUTHORIZATION子句中,但這種方式密碼可見。 模塊創(chuàng)建語(yǔ)句中的子句AUTHORIZATION picard;使得用戶picard成為該模塊的屬主。 模塊也可以不指定屬主,這種情況下模塊被公開執(zhí)行,執(zhí)行模塊中的任何操作所必需的權(quán)限必需從別處獲得,例如:在模塊執(zhí)行過(guò)程中銜接和會(huì)話與用戶的關(guān)聯(lián)。2. 創(chuàng)建權(quán)限.3. 檢查權(quán)限的過(guò)程每個(gè)模塊、方式

46、和會(huì)話有一個(gè)相關(guān)用戶(即授權(quán)ID)任何SQL操作有兩部分:操作執(zhí)行涉及的數(shù)據(jù)庫(kù)元素產(chǎn)生操作的代理對(duì)代理有效的權(quán)限來(lái)自當(dāng)前授權(quán)ID,這個(gè)ID可以是:模塊授權(quán)ID:假設(shè)代理正在執(zhí)行的模塊有一個(gè)授權(quán)ID會(huì)話授權(quán)ID只需當(dāng)前授權(quán)ID擁有執(zhí)行操作所涉及的數(shù)據(jù)庫(kù)元素所必需的權(quán)限,就可以執(zhí)行這個(gè)SQL操作。.例如關(guān)系表Movies和Studio是用戶Janeway創(chuàng)建和擁有的方式MovieSchema的一部分。用戶Janeway擁有這些表和方式MovieSchema的任何其他元素的一切權(quán)限。該插入例如可以有如下幾種執(zhí)行方式:.插入例如執(zhí)行方式1用戶Janeway創(chuàng)建了一個(gè)包含AUTHORIZATION Ja

47、neway子句的模塊,這個(gè)插入作為該模塊的一部分來(lái)執(zhí)行,那么Janeway是模塊授權(quán)ID。假設(shè)有模塊授權(quán)ID,該ID總是變成當(dāng)前授權(quán)ID,于是Janeway成為當(dāng)前授權(quán)ID。那么該模塊及其SQL插入語(yǔ)句擁有與用戶Janeway一樣的權(quán)限,包括表Movies和Studio的一切權(quán)限。.插入例如執(zhí)行方式2插入是模塊的一部分,但是該模塊沒有屬主;用戶Janeway在CONNECT語(yǔ)句中用AUTHORIZATION Janeway子句翻開一個(gè)銜接(會(huì)話授權(quán)ID) 。于是 Janeway再次成為當(dāng)前授權(quán)ID,該插入擁有了所需的一切權(quán)限。.插入例如執(zhí)行方式3用戶Janeway將表Movies和Studio

48、一切權(quán)限授權(quán)給用戶archer,或是代表“一切用戶的特殊用戶PUBLIC假定插入語(yǔ)句存在于帶有AUTHORIZATION archer子句的模塊中,模塊授權(quán)ID是archer ,因此當(dāng)前授權(quán)ID是archer。而且archer擁有所需的權(quán)限,故插入再次被允許。.插入例如執(zhí)行方式4假定用戶Janeway曾經(jīng)將所需的權(quán)限給了用戶archer。同時(shí)又假定插入語(yǔ)句存在于沒有屬主的模塊中,模塊在一個(gè)會(huì)話中執(zhí)行,該會(huì)話的授權(quán)ID由AUTHORIZATION archer子句設(shè)置。會(huì)話授權(quán)ID是archer。這樣當(dāng)前授權(quán)ID是archer且這個(gè)ID擁有所需的權(quán)限。 .四條準(zhǔn)那么擁有數(shù)據(jù)的用戶,其ID就是當(dāng)前

49、授權(quán)ID,那么所需權(quán)限總是可用的。執(zhí)行方法(1)和(2) 假設(shè)用戶的ID是當(dāng)前授權(quán)ID,而且數(shù)據(jù)的屬主曾經(jīng)把所需求的權(quán)限授予了該用戶或授予給用戶PUBLIC,那么這些權(quán)限也是可用的。執(zhí)行方法(3)和(4)執(zhí)行數(shù)據(jù)的擁有者所擁有的模塊或者執(zhí)行對(duì)數(shù)據(jù)已有授權(quán)的某個(gè)用戶所擁有的模塊,就使得所需求的權(quán)限是可用的。執(zhí)行方法(1)和(3)在會(huì)話它的授權(quán)ID是具有所需求權(quán)限的用戶期間執(zhí)行公用模塊是合法執(zhí)行該操作的另一種方法。執(zhí)行方法(2)和(4).4. 授權(quán)SQL提供了GRANT語(yǔ)句,以允許一個(gè)用戶將權(quán)限授權(quán)給另一個(gè)用戶。第一個(gè)用戶仍保管所授予的權(quán)限。授權(quán)選項(xiàng)WITH GRANT OPTION假設(shè)用戶A將帶

50、有授權(quán)選項(xiàng)的某個(gè)權(quán)限授權(quán)給用戶B,那么用戶B可以把該權(quán)限再次授權(quán)給別的用戶(帶授權(quán)選項(xiàng)或不帶);假設(shè)用戶A 授予用戶B某個(gè)權(quán)限時(shí)不帶授權(quán)選項(xiàng),那么用戶B無(wú)法再將該權(quán)限授予別的用戶只需A 可以把該權(quán)限授予別的用戶.授權(quán)語(yǔ)句的語(yǔ)法格式GRANT ON TO WITH GRANT OPTION 典型的是一個(gè)關(guān)系(根本表或視圖)。假設(shè)是其他類型的元素,元素名之前應(yīng)有作前綴,如ASSERTION。是一個(gè)或多個(gè)權(quán)限,如INSERT (name )或 SELECT。關(guān)鍵字ALL PRIVILEGES可根據(jù)需求在此出現(xiàn),表示授權(quán)者對(duì)正在討論的數(shù)據(jù)庫(kù)元素可合法授予的一切權(quán)限。.授權(quán)語(yǔ)句的執(zhí)行為了合法地執(zhí)行這條授

51、權(quán)語(yǔ)句,執(zhí)行它的用戶必需擁有被授予的權(quán)限,而且這些權(quán)限還必需帶有授權(quán)選項(xiàng)。但授權(quán)者可以擁有比授出的權(quán)限更通用的權(quán)限(帶有授權(quán)選項(xiàng))。例如,表Studio的INSERT(name)權(quán)限被授出,同時(shí)授權(quán)者擁有表Studio的更通用的帶有授權(quán)選項(xiàng)的權(quán)限INSERT。.授權(quán)例如用戶Janeway是MovieSchema方式的屬主,該方式包括 Movies (title, year, length, genre, studioName, producerC#) Studio (name, address, presC#)(1) Janeway將表Studio的INSERT和SELECT權(quán)限以及表Movi

52、es的SELECT權(quán)限授予用戶kirk和picard。而且包括了這些權(quán)限的授權(quán)選項(xiàng)。 GRANT SELECT,INSERT ON Studio TO kirk, picard WITH GRANT OPTION; GRANT SELECT ON Movies TO kirk, picard WITH GRANT OPTION;.授權(quán)例如(續(xù))(2) Picard授予用戶sisko一樣的權(quán)限,但沒有授權(quán)選項(xiàng) GRANT SELECT,INSERT ON Studio TO Sisko; GRANT SELECT ON Movies TO Sisko;(3) Kirk也授予Sisko 表Stud

53、io的SELECT和INSERT (name) 權(quán)限以及Movies的SELECT權(quán)限 GRANT SELECT,INSERT (name) ON Studio TO Sisko; GRANT SELECT ON Movies TO Sisko;.5. 授權(quán)圖用授權(quán)圖表示授權(quán)。SQL系統(tǒng)維護(hù)授權(quán)圖的表示,并跟蹤權(quán)限及其起始點(diǎn)(以防權(quán)限被收回)。授權(quán)圖的節(jié)點(diǎn)對(duì)應(yīng)一個(gè)用戶和一個(gè)權(quán)限。留意:執(zhí)行語(yǔ)句帶或不帶授權(quán)選項(xiàng)是不同的權(quán)限,必需用兩個(gè)不同的節(jié)點(diǎn)表示(即使屬于同一用戶也如此)假設(shè)某用戶的一個(gè)權(quán)限比另一個(gè)權(quán)限更通用(如R上的SELECT與在R(A)上的SELECT),也要用兩個(gè)不同的節(jié)點(diǎn)表示。假設(shè)用戶U將權(quán)限P授予用戶V,該授權(quán)是基于U擁有權(quán)限Q ,于是從節(jié)點(diǎn)U/Q到節(jié)點(diǎn)V/P可以畫一條弧 Q可以是帶授權(quán)選項(xiàng)的P,或是P帶有授權(quán)選項(xiàng)的泛化.授權(quán)圖商定節(jié)點(diǎn)的“用戶名權(quán)限后,用一個(gè)*表示該權(quán)限帶有授權(quán)選項(xiàng)節(jié)點(diǎn)的“用戶名權(quán)限后,用*闡明了該權(quán)限來(lái)自正在討論的數(shù)據(jù)庫(kù)元素的一切權(quán)(而不是由別處授予的權(quán)限) 并自動(dòng)包括了授權(quán)選項(xiàng)。 .授權(quán)圖例如 GRANT SELECT,INSERT ON Studio TO kirk, picard WITH GRANT OPTION;JanawaySELECT on Movie*JanawayINSERT on Studio*JanawayINSERT

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論