6.視圖
視圖是從一個(gè)或幾個(gè)基本表(或視圖)導(dǎo)出的表。某一用戶可以定義若干視圖。因此對(duì)某一用戶而言,按ANSI/SPARC報(bào)告的觀點(diǎn),他的外模式是由若干基本表和若干視圖組成的。視圖和基本表不同,視圖是一個(gè)虛表,即視圖所對(duì)應(yīng)的數(shù)據(jù)不實(shí)際存儲(chǔ)在數(shù)據(jù)庫(kù)中,數(shù)據(jù)庫(kù)中只存儲(chǔ)視圖的定義(存在數(shù)據(jù)字典中)。視圖一經(jīng)定義就可以和基本表一樣被查詢、被刪除(DROP),也可以用來定義新的視圖,但更新(增、刪、改)操作將有一定限制。視圖可以理解成一個(gè)數(shù)據(jù)庫(kù),只有內(nèi)涵保存在數(shù)據(jù)庫(kù)字典中,而無外延存儲(chǔ);其外延是在使用時(shí)動(dòng)態(tài)地生成的或計(jì)算出來的。
(1)視圖的定義與刪除
SQL建立視圖的語句格式為:
CREATE VIEW視圖名[(字段名[,字段名]…)]
AS子查詢
[WITH CHECK OPTION謂詞];
視圖可以刪除,語句格式為:
DROP VIEW視圖名;
視圖的定義就從數(shù)據(jù)字典中刪除。由此視圖導(dǎo)出的其它視圖也將自動(dòng)被刪除。若導(dǎo)出此視圖的基本表刪除了,則此視圖也將自動(dòng)刪除。
(2)視圖的查詢語句
視圖定義后,用戶可以如同基本表那樣對(duì)視圖查詢。
(3)視圖的更新語句對(duì)視圖的更新最終要轉(zhuǎn)換成對(duì)基本表的更新(這里的更新,指INSERT,UPDATE和DELETE三類操作)。在關(guān)系數(shù)據(jù)庫(kù)中,并非所有的視圖都是可更新的,也就是說,有些視圖的更新不能唯一地有意義地轉(zhuǎn)換成對(duì)基本表的更新。
(4)視圖的優(yōu)點(diǎn)視圖的概念具有很多優(yōu)點(diǎn),主要有:
(1)視圖對(duì)于數(shù)據(jù)庫(kù)的重構(gòu)造提供了一定程度的邏輯獨(dú)立性;
(2)簡(jiǎn)化了用戶觀點(diǎn);
(3)視圖機(jī)制使不同的用戶能以不同的方式看待同一數(shù)據(jù);
(4)視圖機(jī)制對(duì)機(jī)密數(shù)據(jù)提供了自動(dòng)的安全保護(hù)功能。
7.SQL的數(shù)據(jù)控制功能
SQL數(shù)據(jù)控制功能是指控制用戶對(duì)數(shù)據(jù)的存取權(quán)力。某個(gè)用戶對(duì)某類數(shù)據(jù)具有何種操作權(quán)力是由DBA決定的。這是個(gè)政策問題而不是技術(shù)問題。數(shù)據(jù)庫(kù)管理系統(tǒng)的功能是保證這些決定的執(zhí)行。為此它必須能:
(1)把授權(quán)的決定告知系統(tǒng),這是由SQL的GRANT和REVOKE語句來完成的。
(2)把授權(quán)的結(jié)果存入數(shù)據(jù)字典。
(3)當(dāng)用戶提出操作請(qǐng)求時(shí),根據(jù)授權(quán)情況進(jìn)行檢查,以決定是執(zhí)行操作請(qǐng)求還是拒絕之。授權(quán)語句的一般格式為:
GRANT權(quán)力[,權(quán)力]…[ON對(duì)象類型對(duì)象名] TO用戶[,用戶]…,
[WITH GRANT OPTION];
對(duì)不同類型的操作對(duì)象可有不同的操作權(quán)力。
(1)對(duì)基本表、視圖及其字段的操作權(quán)力有查詢、插入、更新、刪除以及它們的總和ALL PRIVILEGE。
(2)對(duì)基本表的操作權(quán)力還有修改(ALTER)和建立索引(INDEX)。
(3)對(duì)數(shù)據(jù)庫(kù)的操作權(quán)力有建立表(CREATETAB)。某用戶有了此權(quán)力就可以使用Create table建立基本表。稱他為表的主人,擁有對(duì)此表的一切操作權(quán)力。
(4)對(duì)表空間的權(quán)力有使用(USE)數(shù)據(jù)庫(kù)空間存儲(chǔ)基本表的權(quán)力。
(5)系統(tǒng)權(quán)力有建立新數(shù)據(jù)庫(kù)(CREATEDBA)的權(quán)力。GRANT語句中的任選項(xiàng)WITH GRANT OPTION的作用是使獲得某種權(quán)力的用戶可以把權(quán)力再授予別的用戶。
8.嵌入式SQL
把SQL嵌入主語言使用時(shí)必須解決三個(gè)問題:
(1)區(qū)分SQL語句與主語言語句。這是通過在所有的SQL語句前加前綴EXEC SQL來解決的。SQL語句結(jié)束標(biāo)志隨主語言不同而不同,如PL/1用分號(hào)(;),COBOL用EMD-EXEC來表示。SQL語句首先由預(yù)編譯程序加以處理,轉(zhuǎn)換為主語言編譯程序能夠識(shí)別的形式,然后交主語言編譯程序進(jìn)一步處理。
(2)數(shù)據(jù)庫(kù)工作單元和程序工作單元之間的通信。SQL語句中可以使用主語言的程序變量(簡(jiǎn)稱主變量),這些變量名前加冒號(hào)(:)作標(biāo)志,以區(qū)別地字段名,程序中使用的任何表(基本表或視圖)都要用EXEC SQL DECLARE語句加以說明。一則使程序更加清晰,二則使預(yù)編譯程序能作某些語法檢查。SQL語句執(zhí)行后,系統(tǒng)要反饋給應(yīng)用程序若干信息,這些信息送到SQL的通信區(qū)SQL CA。SQL CA用語句EXEC SQL INCLUDE加以定義。在SQL CA中有一個(gè)狀態(tài)指示字段SQL CODE。當(dāng)SQL CODE為零時(shí),表示SQL語句執(zhí)行成功,否則返回一個(gè)錯(cuò)誤代碼(負(fù)值)或警告信息(正值)。程序員應(yīng)該在每個(gè)SQL語句之后測(cè)試SQL CODE的值,以便處理各種情況。
(3)一個(gè)SQL語句原則上可產(chǎn)生或處理一組記錄,而主語言一次只能處理一個(gè)記錄,為此必須協(xié)調(diào)兩種處理方式。這是用游標(biāo)(Cursor)來解決的。下面首先討論不需要游標(biāo)的DML語句,然后討論使用游標(biāo)的DML語句。
相關(guān)推薦:
北京 | 天津 | 上海 | 江蘇 | 山東 |
安徽 | 浙江 | 江西 | 福建 | 深圳 |
廣東 | 河北 | 湖南 | 廣西 | 河南 |
海南 | 湖北 | 四川 | 重慶 | 云南 |
貴州 | 西藏 | 新疆 | 陜西 | 山西 |
寧夏 | 甘肅 | 青海 | 遼寧 | 吉林 |
黑龍江 | 內(nèi)蒙古 |