(4)關(guān)閉(CLOSE)游標。關(guān)閉游標,使它不再和原來的查詢結(jié)果相聯(lián)系。關(guān)閉了的游標可以再次被打開,與新的查詢結(jié)果集相聯(lián)系。使用CURRENT形式的UPDATE和刪除語句應(yīng)注意:
(1)若游標定義中的SELECT語句帶有UNION或ORDER BY子句,或者這個SELECT語句相當于定義了一個不可更新的視圖,則不能用這兩個更新語句。
(2)若使用CURRENT形式的UPDATE語句,則游標定義中要包括FOR UPDATE子句,指出更新的字段(SET子句中使用的字段)。因此,游標定義語句的一般格式為:EXEC SQL DECLARE游標名CURSOR FOR子查詢UNION子查詢…[FOR UPDATE OF字段名[,字段名]…|ORDER-BY-子句];
11.SQL的事務(wù)處理功能
(1)事務(wù)處理的概述所謂事務(wù)(Transaction)是指一系列動作的組合,這些動作被當作一個整體來處理。這些動作或者相繼都被執(zhí)行,或者什么也不做。在數(shù)據(jù)庫中,一個動作是指一個SQL語句。事務(wù)是一組SQL語句組成的一個邏輯單位。要么這些SQL語句全部被按順序正確執(zhí)行,要么在某SQL語句執(zhí)行失敗時,按照用戶要求,取消已執(zhí)行的SQL語句對數(shù)據(jù)庫中數(shù)據(jù)的修改?;蛘咭词聞?wù)中SQL語句都被正確執(zhí)行,完成該事務(wù)對數(shù)據(jù)庫中數(shù)據(jù)的所有操作;或者要么相當于一條SQL語句也未執(zhí)行,數(shù)據(jù)庫數(shù)據(jù)未做任何改動。
(2)SQL語言的事務(wù)處理語句SQL語言有3條語句用于事務(wù)處理,它們是:
(1)Commit語句,對于正確執(zhí)行了的事務(wù)進行提交,進行提交即對數(shù)據(jù)庫中數(shù)據(jù)的修改永久化。同時還釋放事務(wù)和封鎖,標志該事務(wù)結(jié)束。
(2)Save point語句,定義事務(wù)中的一個回滾保留點,它是事務(wù)恢復(fù)時的一個標記點。
(3)rollback語句,無論事務(wù)執(zhí)行的當前位置在哪里,該語句的執(zhí)行要么取消事務(wù)執(zhí)行以來對數(shù)據(jù)庫的全部修改,要么取消至某個指定回滾點后對數(shù)據(jù)庫的全部修改。釋放自保留點之后的全部表或行的封鎖(沒有保留點,相當于回滾到事務(wù)開始處,終止該事務(wù))。事務(wù)的恢復(fù)(回滾)是根據(jù)事務(wù)執(zhí)行前保存下的當時數(shù)據(jù)庫狀態(tài)來實現(xiàn)的。一遇到rollback語句,就將數(shù)據(jù)庫中數(shù)據(jù)恢復(fù)到原來的狀態(tài),相當于撤消事務(wù)中已執(zhí)行了的SQL語句。來源:www.examda.com
四、數(shù)據(jù)庫的存儲結(jié)構(gòu)
數(shù)據(jù)庫的存儲結(jié)構(gòu)不同于一般文件系統(tǒng)的存儲結(jié)構(gòu)。數(shù)據(jù)庫數(shù)據(jù)的特點是各種記錄型之間彼此有聯(lián)系,數(shù)據(jù)是結(jié)構(gòu)化的。數(shù)據(jù)的存儲結(jié)構(gòu)不僅涉及每種記錄型的記錄如何存儲,而且要使數(shù)據(jù)的存儲反映各種記錄型之間的聯(lián)系。在DB多級模式中引入內(nèi)模式(存儲模式)的主要目的是使模式的數(shù)據(jù)結(jié)構(gòu)的描述同它的存儲表示的描述分開,以致DBA為了協(xié)調(diào)數(shù)據(jù)庫性能而對數(shù)據(jù)庫數(shù)據(jù)的存儲方法進行修改時,可不必修改模式,以提高數(shù)據(jù)庫的物理獨立性。在各個數(shù)據(jù)庫管理系統(tǒng)中,對內(nèi)模式的定義功能各不相同。在關(guān)系數(shù)據(jù)庫管理系統(tǒng)中有些DDL語句可影響數(shù)據(jù)庫的存儲結(jié)構(gòu)。在DBMS中各級模式的存儲結(jié)構(gòu)是恒定的或的,而數(shù)據(jù)庫內(nèi)容(或其記錄)的存儲方式是不的。數(shù)據(jù)庫存儲結(jié)構(gòu)設(shè)計的好壞直接影響系統(tǒng)的性能。在存儲結(jié)構(gòu)中主要是涉及存儲記錄的設(shè)計。存儲記錄與概念記錄之間具有對應(yīng)關(guān)系,如果存儲記錄與概念記錄之間具有一一對應(yīng)關(guān)系,在這種情況下存儲記錄的設(shè)計就比較簡單,不需要進一步討論。概念記錄是指在邏輯結(jié)構(gòu)中的記錄。但當一個概念記錄對應(yīng)多個不同類型的存儲記錄時,存在如何設(shè)計存儲記錄的問題。對于這樣的概念記錄,其存儲記錄可以有以下幾種設(shè)計:
1.順序組織
將存儲記錄設(shè)計成與概念記錄一一對應(yīng),按SNO大?。ɑ虬从涗浀絹恚┑捻樞?qū)⒂涗浗M成一個順序組織的文件。這樣組織的優(yōu)點是結(jié)構(gòu)簡單,缺點是會浪費存儲空間。
2.順序帶鏈的組織
順序帶鏈組織允許記錄中帶有指針(Pointer),這樣可以大大節(jié)省存儲空間。
3.帶次關(guān)鍵字索引的順序組織
為了適應(yīng)對多項內(nèi)容的檢索,可以建立索引文件,上述組織可改為帶次關(guān)鍵字索引的順序組織。
4.多表組織
在次關(guān)鍵字索引中,由于一個次關(guān)鍵字值對應(yīng)于多個記錄值,它們的個數(shù)是不固定的,所以對應(yīng)的指針數(shù)目是可變的。這種可變性給管理帶來困難,為了解決這個困難,引入了多表組織。多表組織的實現(xiàn)思想比較簡單,在索引中多個指針分散存放在每個記錄值中,索引項中的指針指向第一個記錄,在第一個記錄中的指針指向第二個記錄等等。
5.完全倒排組織在一個記錄型中,對主關(guān)鍵字以外的數(shù)據(jù)項都建立索引,這樣的組織稱之為完全倒排組織。
6.Hash定址組織對于每一個存儲記錄值存放在數(shù)據(jù)庫的什么地方,可通過對該記錄的主關(guān)鍵字值的雜湊函數(shù)計算得出。這種組織為Hash定址組織。雜湊函數(shù)種類很多,如質(zhì)數(shù)除余法、基數(shù)轉(zhuǎn)換法、平方取中法、折疊法、位移法及各位數(shù)字分析法等等。關(guān)鍵是如何選擇一個雜湊函數(shù),盡可能避免發(fā)生碰撞。對于不同的主關(guān)鍵字值通過計算而得到同一個地址的映象,稱之為碰撞。
7.聯(lián)系的存儲
在關(guān)系數(shù)據(jù)庫中,通過外來關(guān)鍵字(Foreign Key)來表示概念記錄之間的聯(lián)系。例如,為了表達學(xué)生和學(xué)校的聯(lián)系,可以在學(xué)生記錄中增加外來關(guān)鍵字“學(xué)校號”來表示聯(lián)系。
五、關(guān)系數(shù)據(jù)庫
1.表格
表格(或簡稱表)表示了用戶的特定類型(Type)的一些實體。表頭由一些屬性名(Attribute Name)組成,每個屬性名對應(yīng)于一列。在表上屬性名必須,不允許重名。表體是由一些行或元組(tuple)、或記錄(record)組成。一個元組對應(yīng)于傳統(tǒng)的文件結(jié)構(gòu)中的一個記錄,一個記錄含有若干個域(field)用以存儲屬性值(Attribute value)。一個元組對應(yīng)于一個“用戶”實體的出現(xiàn)(occurrence)。表體中每一行和某一列的交叉點(相當于記錄中的域)上保存一個屬性值。這個屬性值叫做這一行(或這個實體出現(xiàn))的相應(yīng)屬性值。表體中每一列可以保存的值對應(yīng)于某種屬性類型(Type of Attribute),也就是說,這一列的屬性值只能取這個屬性類型的值。某個屬性所能取的所有值的集合叫做這個屬性的值域(Domain of Attribute)。類型和值域的對應(yīng)關(guān)系是一對多的。一個類型有一個值域,但一個值域可以作為多個類型,基名稱不同,但實質(zhì)上值域一樣。實際上,類型是對值域的命名。能標識一個元組的屬性稱之為關(guān)鍵屬性(Primary Key Attribute)或簡稱為主關(guān)鍵字(Primary Key)。主關(guān)鍵字有時是由多個屬性組成的,此時的主關(guān)鍵字叫做組合關(guān)鍵字(Conˉcatenated primary Key)。有的時候,表中必須由一些組合的主關(guān)鍵字才能地標識一個元組,也就是說,不存在能作關(guān)鍵字的一個屬性。這時為了方便,往往引入一個附加的屬性并稱之為外來關(guān)鍵字(Foreigh Key)來作主關(guān)鍵字。外來關(guān)鍵字為以后檢索和查詢帶來了方便,但也增加了信息冗余。來源:www.examda.com
2.表名、表頭和表體
表名、表頭和表體在關(guān)系模型中具有不同的作用或功能,因而也具有完全不同的性質(zhì)。表頭是一個屬性的集合,它規(guī)定了表的結(jié)構(gòu)。表體是一個特殊的集體,稱作為關(guān)系(relation)。“關(guān)系模型”中的“關(guān)系”一詞就是指表體中的這個數(shù)學(xué)關(guān)系。在關(guān)系數(shù)據(jù)庫中,表名對應(yīng)于數(shù)據(jù)庫名(或關(guān)系名),表頭對應(yīng)于數(shù)據(jù)描述(或結(jié)構(gòu)描述),表體對應(yīng)于數(shù)據(jù)庫。表體是數(shù)據(jù)庫的內(nèi)容及數(shù)據(jù)庫操作的對象。另外,有兩個概念必須加以強調(diào):型(type)和值或出現(xiàn)(occurence)。表頭定義了實體(或元組)的型,也就是說規(guī)定了實體(或元組)的值域。而表體則給出了實體(或元組)的出現(xiàn)。出現(xiàn)是型中的一個值。
3.關(guān)系的數(shù)學(xué)定義
關(guān)系模型是建立在集合論(Set Theory)的基礎(chǔ)之上的?,F(xiàn)在,開始用集合論的術(shù)語來嚴格地定義數(shù)學(xué)上的關(guān)系,即給出關(guān)系的數(shù)學(xué)定義。定義1 域(Domain)是值(value)的集合。
4.關(guān)系模型
關(guān)系模型由三部分組成:數(shù)據(jù)結(jié)構(gòu)(即關(guān)系)、關(guān)系操作、關(guān)系的完整性。下面將對這三個部分進行分別的討論。(1)單一的數(shù)據(jù)結(jié)構(gòu)———關(guān)系 在關(guān)系模型中,無論是實體還是實體之間的聯(lián)系均由單一的類型結(jié)構(gòu)—關(guān)系來表示。在前面,已給出了關(guān)系和域的數(shù)學(xué)定義,介紹了n元關(guān)系、元組和屬性等概念。下面介紹關(guān)鍵字、關(guān)系模式和關(guān)系數(shù)據(jù)庫等一些基本概念。關(guān)鍵字 關(guān)系中的某一組屬性,若其值可以地標識一個元組,則稱該屬性組為一個候選關(guān)鍵字(Candidate Key)。若一個關(guān)系有多個候選關(guān)鍵字,則可以任選其中一個作為主關(guān)鍵字(Primary Key)。主關(guān)鍵字中的諸屬性被稱為主屬性。關(guān)系模式 關(guān)系的描述稱為關(guān)系模式。它包括:關(guān)系名、組成關(guān)系的諸屬性名、屬性到域的映象、屬性間的數(shù)據(jù)依賴關(guān)系等等。所以,關(guān)系模式由關(guān)系名、諸屬性名和屬性到域的映象三個部分組成,關(guān)系模式通常簡記為R(A 1 ,A 2 ,…,A n ),其中R是關(guān)系名,A 1 ,A 2 ,…,A n 為諸屬性名。屬性到域的映象一般通過指定屬性的類型和長度來說明。某個關(guān)系模式在某一時刻所具有的狀態(tài)是指關(guān)系的外延,即元組的集合。關(guān)系的外延內(nèi)容有時簡稱為關(guān)系。但關(guān)系模式和關(guān)系的內(nèi)容有時也統(tǒng)稱為關(guān)系。讀者可以從上下文中區(qū)別其確切的含義。形象地說,關(guān)系模式是關(guān)于表名和表頭的描述,而關(guān)系的內(nèi)容是表體。關(guān)系數(shù)據(jù)庫 在關(guān)系數(shù)據(jù)庫中,要分清型和值兩個基本概念。關(guān)系數(shù)據(jù)庫的型是指數(shù)據(jù)庫的結(jié)構(gòu)描述,它包括關(guān)系數(shù)據(jù)庫名、若干屬性的定義,以及這些屬性上的若干關(guān)系關(guān)系模式。亦稱為數(shù)據(jù)庫的內(nèi)涵(Intension),數(shù)據(jù)庫的值亦稱為數(shù)據(jù)庫的外延。在關(guān)系數(shù)據(jù)庫中,內(nèi)涵是比較穩(wěn)定的,它規(guī)定了外延的取值范圍。而外延卻是隨時間變化的。這和在一般的形式邏輯中外延和內(nèi)涵一一對應(yīng)有所區(qū)別。此處外延是指任意一個滿足內(nèi)涵的集合,而不一定恒指滿足內(nèi)涵的的一個集合。關(guān)系模式(即內(nèi)涵)是穩(wěn)定的;而關(guān)系的內(nèi)容,即外延,卻是隨時間動態(tài)的變化而變化的。數(shù)據(jù)庫的結(jié)構(gòu)(即模式)是穩(wěn)定的;而數(shù)據(jù)庫中的數(shù)據(jù)內(nèi)容卻在不斷地更新。
(2)關(guān)系操作 關(guān)系模型規(guī)定了關(guān)系操作的功能和特點,但不對DBMS語言的語法做出具體的規(guī)定。關(guān)系數(shù)據(jù)庫語言的主要特點(或優(yōu)點)是其高度的非過程化(Non-procedureae)或者說明性(declarative)。關(guān)系數(shù)據(jù)庫語言的語句是透明的。用戶只須知道語句做什么,而不須知道怎么做的。Codd在其早期的文章中,引入了8種基本的操作:并(Union)交(Intersection)差(Difference)笛卡爾乘積(Cartesian Product)限制(Restrictions)投影(Projection)連接(Join)除(Division)這些操作都是對關(guān)系的內(nèi)容或表體實施操作的,得到的結(jié)果仍為關(guān)系。注意,這些操作只是基本的操作,而不是不再可分的原始(Primitive)操作,例如,Join,Intersection和Division可以由其它五種操作合成。但是,把它們?nèi)齻€也作為基本操作使用起來很方便。另外,Codd并沒說上述8種操作就是關(guān)系數(shù)據(jù)庫只能有的8種操作。實際上,上述8種操作僅僅是作為最小的DML操作的基礎(chǔ)部分,并且也還未考慮到DDL的需求。SQL支持的操作多于上述8種DML操作,而且SQL還支持DDL操作。關(guān)系操作的特點是集合操作,即操作的對象和結(jié)果都是集合。這種操作方式也稱為一次一集合(set-at-a-time)方式。而非關(guān)系模型的數(shù)據(jù)庫的操作方式則為一次一記錄(record-at-a-time)方式。關(guān)系操作可以用兩種方式來表示:
①代數(shù)方式,即關(guān)系代數(shù)
②邏輯方式,即關(guān)系演算而關(guān)系演算又進一步分為元組關(guān)系演算和域關(guān)系演算。已經(jīng)證明,這些表示方式在功能上是相互等價的。一般選其一即可。
(3)關(guān)系模型的三類完整性 關(guān)系模型的三類完整性是:
①實體完整性(Entity Integrity)
②參照完整性(Referential Integrity)
③用戶定義的完整性(User Defined Integrity)其中,實體完整性和參照完整性是任何關(guān)系模型都必須滿足的完整性約束條件,應(yīng)該由關(guān)系數(shù)據(jù)庫DBMS自動支持。而用戶定義的完整性的支持是由DBMS提供完整性定義設(shè)施(或機制),可以隨DBMS商品軟件不同而有所變化。實體完整性是指:若屬性A是基本關(guān)系R的主關(guān)鍵字的屬性(即主屬性),則屬性A不能取空值(NULL)。在關(guān)系數(shù)據(jù)庫中有各種關(guān)系,如基本關(guān)系(常稱為基本表)、查詢表、視圖表等等?;颈硎侵笇嶋H存在的表,它是實際存儲數(shù)據(jù)的邏輯表示。查詢表是指和查詢結(jié)果相對應(yīng)的表。而視圖表是由基本表或視圖表導(dǎo)出的表,是虛表,不對應(yīng)實際存儲的數(shù)據(jù)。實體完整性是針對基本關(guān)系的。空值是指“不知道”或者“無意義的”或“不屬于定義域”值??罩狄浴癗ULL”表示。對于實體完整性作如下說明:
(1)一個基本關(guān)系通常對應(yīng)于現(xiàn)實世界中的一個實體集。例如學(xué)生關(guān)系對應(yīng)于學(xué)生實體集?;娟P(guān)系不是由其它關(guān)系生成的關(guān)系?;娟P(guān)系是本原(Primitive),是定義復(fù)雜關(guān)系的出發(fā)點。
(2)現(xiàn)實世界中的實體是可區(qū)分的,即實體具有某種性的標識。
(3)在關(guān)系模型中由主關(guān)鍵字作為滿足性的標識。
(4)主關(guān)鍵字中屬性不能取空值。因為若主關(guān)鍵字中某屬性取空值,則意味著某個實體不可標識;而這和(2)相矛盾。參照完整性是指:若基本關(guān)系R中含有另一個基本關(guān)系S的主關(guān)鍵字K S 所對應(yīng)的屬性組F(F稱為R的外部關(guān)鍵字(external keys)),則在關(guān)系R中的每個元組中的F上的值必須滿足:
①或者取空值(即F中的每個屬性的值均為空值);
②或等于S中某個元組的主關(guān)鍵字的值。基本關(guān)系R和S不一定是不同的關(guān)系。外部關(guān)鍵字也稱為外來關(guān)鍵字。例如,某數(shù)據(jù)庫中有職工關(guān)系EMP(職工號,姓名,部門號)和部門關(guān)系DEPT(部門號,部門名稱)為兩個基本關(guān)系。關(guān)系EMP的主關(guān)鍵字為“職工號”,DEPT的主關(guān)鍵字為“部門號”在EMP中,“部門號”是EMP的外部關(guān)鍵字。故此,在EMP中的每個元組中“部門號”的值只有兩種可能性:
①取空值。這說明這個職工尚未分到某個部門;
②或取非空值。這時“部門號”的值必須是DEPT中某個元組中的“部門號”的值。這說明一個職工不可能被分配到一個不存在的部門。也就是說,被參照的關(guān)系DEPT中一定存在一個元組,該元組的關(guān)鍵字的值等于EMP中某元組的外部關(guān)鍵字的值。實體完整性和參照完整性是針對任何關(guān)系數(shù)據(jù)庫系統(tǒng)的所有數(shù)據(jù)庫的一般性原則。用戶定義的完整性針對某一具體的數(shù)據(jù)庫的約束條件。條件是由現(xiàn)實世界中的應(yīng)用環(huán)境決定的。它涉及到某一具體的應(yīng)用中的數(shù)據(jù)所必須滿足的語義要求。關(guān)型模型的DBMS應(yīng)提供定義和檢驗這類完整性條件的機制,以使用統(tǒng)一的方法來自動地處理它們而不要求應(yīng)用程序員來承擔這一功能。來源:www.examda.com
5.關(guān)系數(shù)據(jù)庫語言概述
關(guān)系數(shù)據(jù)庫語言分三類:數(shù)據(jù)描述語言DDL,數(shù)據(jù)操縱語言DML和數(shù)據(jù)控制語言DCL。其中,DDL負責(zé)數(shù)據(jù)庫的描述,提供一種數(shù)據(jù)描述機制,用來描述數(shù)據(jù)庫的特征或數(shù)據(jù)的邏輯結(jié)構(gòu)。DML負責(zé)數(shù)據(jù)庫的操作,提供一種處理數(shù)據(jù)庫操作的機制。DCL負責(zé)控制數(shù)據(jù)庫的完整性和安全性,提供一種檢驗完整性和保證安全的機制。DML是用戶經(jīng)常使用的語言,包括了DBMS的主要功能。DML包括數(shù)據(jù)查詢和數(shù)據(jù)的增、刪、改等功能。其中查詢的表達方式是DML的主要部分。關(guān)系數(shù)據(jù)庫的DML按照查詢方式可以分為兩大類:
(1)用對關(guān)系的集合代數(shù)運算來表示查詢的方式,稱為關(guān)系代數(shù)(Relational Algebra)。
(2)用謂詞演算來表達查詢的方式,稱為關(guān)系演算(Relational Calculus)。關(guān)系演算又可按謂詞變元的基本對象是元組變量(tuple variable)還是域變量(domain variable)分為元組關(guān)系演算和域關(guān)系演算兩種。關(guān)系代數(shù)和兩種關(guān)系演算均是抽象的查詢語言,這些抽象的查詢語言和實際的DBMS軟件產(chǎn)品中實現(xiàn)的具體的查詢語言并不完全一樣。但它們是DBMS中查詢語言的理論基礎(chǔ)。關(guān)系代數(shù)、元組關(guān)系演算和域關(guān)系演算這三種語言在表達能力上是彼此相互等價的,它們均可以作為評價實際DBMS軟件產(chǎn)品中查詢語言能力的標準。實際DBMS軟件產(chǎn)品的查詢語言,除了提供關(guān)系代數(shù)(或一種關(guān)系演算)之外,還提供了許多附加的功能,如庫函數(shù)、算術(shù)運算等功能。SQL是介于關(guān)系代數(shù),和關(guān)系演算之間的一種語言。SQL不僅具有豐富的查詢功能,而且還具有數(shù)據(jù)庫定義和數(shù)據(jù)庫控制功能。SQL是集DDL、DML、DCL為一體的標準的關(guān)系數(shù)據(jù)庫語言。SQL充分體現(xiàn)了關(guān)系數(shù)據(jù)庫語言的優(yōu)點。
6.關(guān)系代數(shù)
關(guān)系代數(shù)中的運算可以分為兩類:
(1)傳統(tǒng)的集合運算,如并、交、差、笛卡爾乘積等。這類運算是從關(guān)系的“水平方向(即按行)”來進行的。
(2)專門的關(guān)系運算,如選擇、投影、連接、除。這類運算不僅涉及到行而且也涉及到列。
7.關(guān)系演算
關(guān)系演算是以數(shù)理邏輯中的謂詞演算為基礎(chǔ)的。用謂詞演算作為關(guān)系數(shù)據(jù)庫的語言并提出關(guān)系演算的是E.F.Codd。Codd首先定義了關(guān)系演算語言ALPHA。但ALPHA并沒有在計算機上實現(xiàn)。但關(guān)系數(shù)據(jù)庫管理系統(tǒng)INGRES所用的QUEL語言是參考ALPHA研制的,與ALPHA十分類似。
六、關(guān)系數(shù)據(jù)庫的規(guī)范化理論
函數(shù)依賴
定義1 設(shè)R(U)是屬性集U上的關(guān)系模式。X,Y是U的子集。若對于R(U)的任意一個可能的關(guān)系r,r中不可能存在兩個元組在X上的屬性值相等,而在Y上的屬性值不等,則稱‘X函數(shù)確定Y’或‘Y函數(shù)依賴于X’,記作X→Y。
函數(shù)依賴和別的數(shù)據(jù)依賴一樣是語義范疇的概念。只能根據(jù)語義來確定一個函數(shù)依賴。例如姓名→年齡這個函數(shù)依賴只有在沒有同名人的條件下成立。如果允許有相同名字,則年齡就不再函數(shù)依賴于姓名了。設(shè)計者也可以對現(xiàn)實世界作強制的規(guī)定。例如規(guī)定不允許同名人出現(xiàn),因而使姓名→年齡函數(shù)依賴成立。這樣當插入某個元組時這個元組上的屬性值必須滿足規(guī)定的函數(shù)依賴,若發(fā)現(xiàn)有同名人存在,則拒絕插入該元組。注意,函數(shù)依賴不是指關(guān)系模式R的某個或某些關(guān)系滿足的約束條件,而是指R的一切關(guān)系均要滿足的約束條件
七、數(shù)據(jù)庫的安全與保護
1.安全性
數(shù)據(jù)庫的安全性是指保護數(shù)據(jù)庫以防止不合法的或非正常的使用所造成的數(shù)據(jù)泄露、更改或破壞。安全性問題不是數(shù)據(jù)庫系統(tǒng)所獨有的,計算機系統(tǒng)都有這個問題。只是在數(shù)據(jù)庫系統(tǒng)中大量數(shù)據(jù)集中存放,而且為許多用戶直接共享,是十分重要的信息資源。從而使安全性問題變得更為突出。系統(tǒng)安全保護措施是否有效是數(shù)據(jù)庫系統(tǒng)的主要性能指標之一。對于數(shù)據(jù)庫的安全保密方式可以有系統(tǒng)處理的和物理的兩個方面。所謂物理的是指,對于強力逼迫透露口令、在通信線路上竊聽、以至盜竊物理存儲設(shè)備等行為。對此所采取的措施是將數(shù)據(jù)編為密碼,加強警衛(wèi)以識別用戶身份和保護存儲設(shè)備等措施。在一般計算機系統(tǒng)中,安全措施是一級一級層層設(shè)置的。
(1)用戶標識和鑒定首先,系統(tǒng)提供一定的方式讓用戶標識自己的名字或身份。系統(tǒng)進行核實,通過鑒定后才提供機器使用權(quán)。常用的方法有:用一個用戶名或者用戶標識號來標明用戶身份。系統(tǒng)鑒別此用戶是否是合法用戶。若是,則可以進入下一步的核實;若不是,則不能使用計算機。用戶名的登錄只由系統(tǒng)管理員進行,一般用戶不能實施用戶名登錄??诹睿≒assword),為了進一步核實用戶,系統(tǒng)常常要求用戶輸入口令。
(2)存取控制對于獲得上機權(quán)的用戶還要根據(jù)預(yù)先定義好的用戶權(quán)限進行存取控制,保證用戶只能存取他有權(quán)存取的數(shù)據(jù)。所謂用戶權(quán)限是指不同的用戶對于不同的數(shù)據(jù)對象允許執(zhí)行的操作權(quán)限。它由兩部分組成,一是數(shù)據(jù)對象,二是操作類型。數(shù)據(jù)對象有二類。一類是數(shù)據(jù)本身,如關(guān)系數(shù)據(jù)庫中的表、字段,非關(guān)系數(shù)據(jù)庫中的記錄、字段(亦稱為數(shù)據(jù)項)。另一類是外模式、模式、內(nèi)模式。在關(guān)系系統(tǒng)中DBA可以把建立、修改基本表的權(quán)力授予用戶,用戶獲得此權(quán)力后可以建立基本表、索引、視圖。這說明關(guān)系系統(tǒng)中存取控制的數(shù)據(jù)對象不僅有數(shù)據(jù)而且有模式、外模式、內(nèi)模式等數(shù)據(jù)字典中的內(nèi)容。對于存取權(quán)限的定義稱為授權(quán)(Authorization)。這些定義經(jīng)過編譯后存儲在數(shù)據(jù)字典中。每當用戶發(fā)出存取數(shù)據(jù)庫的操作請求后,DBMS查找數(shù)據(jù)字典,根據(jù)用戶權(quán)限進行合法權(quán)限檢查(Authorization Check)。若用戶的操作請求超出了定義的權(quán)限,系統(tǒng)拒絕執(zhí)行此操作。授權(quán)編譯程序和合法權(quán)限檢查機制一起組成了安全性子系統(tǒng)。衡量授權(quán)子系統(tǒng)精巧程度的另一個盡度是否提供與數(shù)據(jù)值有關(guān)的授權(quán)。有的系統(tǒng)還允許存取謂詞中引用系統(tǒng)變量,如一天中的時刻,終端設(shè)備號。這樣用戶只能在某臺終端、某段時間內(nèi)存取有關(guān)數(shù)據(jù),這就是與時間和地點有關(guān)的存取權(quán)限。另外,在操作系統(tǒng)中對文件、目標等的存取還有一些安全保護措施。其中加密是一種防止數(shù)據(jù)內(nèi)容被別人引用或了解的切實可行的辦法。加密有程序加密和硬件加密卡兩種形式。
2.完整性
數(shù)據(jù)庫的完整性是指數(shù)據(jù)的正確性和相容性。DBMS必須提供一種功能來保證數(shù)據(jù)庫中數(shù)據(jù)的完整性。這種功能亦稱為完整性檢查,即系統(tǒng)用一定的機制來檢查數(shù)據(jù)庫中的數(shù)據(jù)是否滿足規(guī)定的條件。這種條件在數(shù)據(jù)庫中稱為完整性約束條件。數(shù)據(jù)的約束條件是語義的體現(xiàn),這些完整性約束條件將作為模式的一部分存放數(shù)據(jù)字典中。數(shù)據(jù)的完整性和安全性是兩個不同的概念。前者是為了防止數(shù)據(jù)庫中存在不符合語義的數(shù)據(jù),防止錯誤信息的輸入和輸出,即所謂垃圾進垃圾出(Garbage In Garbage Out)所造成的無效操作和錯誤結(jié)果。而后者是保護數(shù)據(jù)庫防止惡意的破壞和非法的存取。當然,完整性和安全性是密切相關(guān)的。特別從系統(tǒng)實現(xiàn)的方法來看,往往是一種機制常常既可用于安全性保護亦可用于完整性保證。完整性約束條件可以分類如下:(1)值的約束和結(jié)構(gòu)的約束前者指對數(shù)據(jù)的值的限制,后者指對數(shù)據(jù)之間聯(lián)系的限制。關(guān)于對數(shù)據(jù)值的約束 這類約束條件是指對數(shù)據(jù)取值類型、范圍、精度等的規(guī)定。關(guān)于數(shù)據(jù)之間聯(lián)系的約束 數(shù)據(jù)庫中同一關(guān)系的不同屬性之間可以有一定的聯(lián)系,從而也應(yīng)滿足一定的約束條件。同時,由于數(shù)據(jù)庫中數(shù)據(jù)是結(jié)構(gòu)化的,不同的關(guān)系之間也可以有聯(lián)系,因而不同關(guān)系的屬性之間也可滿足一定的約束條件。
(2)靜態(tài)約束和動態(tài)約束所謂靜態(tài)約束是指對數(shù)據(jù)庫每一確定狀態(tài)的數(shù)據(jù)所應(yīng)滿足的約束條件。以上所講的約束都屬靜態(tài)約束。動態(tài)約束是指數(shù)據(jù)庫從一種狀態(tài)轉(zhuǎn)變?yōu)榱硪环N狀態(tài)時新、舊值之間所應(yīng)滿足的約束條件。
(3)立即執(zhí)行約束和延遲執(zhí)行約束立即執(zhí)行約束是指在執(zhí)行用戶事務(wù)時,對事務(wù)中某一更新語句執(zhí)行完后馬上對此數(shù)據(jù)所應(yīng)滿足的約束條件進行完整性檢查。延遲執(zhí)行是指在整個事務(wù)執(zhí)行結(jié)束后方對此約束條件進行完整性檢查,結(jié)果正確方能提交。完整性的實現(xiàn)應(yīng)包括兩個方面,一是系統(tǒng)要提供定義完整性約束條件的功能,二是提供檢查完整性約束條件的方法。對于數(shù)據(jù)值的那類完整性約束條件通常在模式中定義。例如在模式中定義屬性名、類型、長度、碼屬性名并標明其值是的、非空的等等。另外的那些約束條件就要用專門的方式加以定義。
3.并發(fā)控制
數(shù)據(jù)庫是一個共享資源,可以由多個用戶使用。這些用戶程序可以一個一個地串行執(zhí)行,也可以并行執(zhí)行。在單CPU計算機上,為了充分利用數(shù)據(jù)庫資源,應(yīng)該允許多個用戶程序并行的存取數(shù)據(jù)。這樣就會產(chǎn)生多個用戶程度并發(fā)地存取同一數(shù)據(jù)的情況。若對并發(fā)操作不加控制就會存取和存儲不正確的數(shù)據(jù),破壞數(shù)據(jù)庫的完整性(這里也稱為一致性)。在多CPU計算機或多計算機網(wǎng)絡(luò)環(huán)境下,并發(fā)控制尤為重要。
(1)事務(wù)的概念 事務(wù)(Transaction)是并發(fā)控制的基本單位。所謂事務(wù)是一個操作序列。這些操作作為一個序列形成一個整體要么都做,要么都不做,是一個不可分割的工作單位。事務(wù)通常以BEGIN TRANSACTION開始,以COMMIT或ROLLBACK操作結(jié)束。COMMIT即提交,提交事務(wù)中所有的操作,事務(wù)正常結(jié)束。ROLLBACK即撤消已作的所有操作,滾回到事務(wù)開始時的狀態(tài)。這里的操作指對數(shù)據(jù)庫的更新操作。滾回即相當于所有操作均未執(zhí)行。事務(wù)和程序是兩個概念。一般地講,一個程序可包括多個事務(wù),由于事務(wù)是并發(fā)控制的基本單位,所以下面的討論均以事務(wù)為對象。

