數(shù)據(jù)庫完整性與安全_第1頁
數(shù)據(jù)庫完整性與安全_第2頁
數(shù)據(jù)庫完整性與安全_第3頁
數(shù)據(jù)庫完整性與安全_第4頁
數(shù)據(jù)庫完整性與安全_第5頁
已閱讀5頁,還剩59頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

第9章數(shù)據(jù)庫完整性與安全

現(xiàn)代學習理念的四大支柱是:學會認知學會做事學會合作學會生存——《學會學習》一書的作者:方州數(shù)據(jù)庫系統(tǒng)原理與設計

(第2版)第9章數(shù)據(jù)庫完整性與安全數(shù)據(jù)庫的安全性:保護數(shù)據(jù)庫以防止不合法使用所造成的數(shù)據(jù)泄密、更改或破壞。數(shù)據(jù)庫的完整性:防止數(shù)據(jù)庫中存在不符合語義的數(shù)據(jù),其防范對象是不合語義的、不正確的數(shù)據(jù)。主要教學目標如下:要求熟練掌握DBMS安全性保護的基本原理與方法,并能熟練運用SQL中的GRANT和REVOKE語句進行授權;要求熟練掌握DBMS完整性保護措施,并能熟練運用SQL中的DDL語句進行完整性約束定義;要求熟練掌握數(shù)據(jù)庫編程中的游標概念及其使用方法;熟練運用觸發(fā)器完成復雜的完整性約束和審計功能;熟練運用存儲過程編寫復雜的業(yè)務處理和查詢統(tǒng)計功能。目錄9.4數(shù)據(jù)庫安全性

9.1數(shù)據(jù)庫完整性

9.29.3游標

存儲過程觸發(fā)器應用與安全設計

9.59.69.1

數(shù)據(jù)庫安全性

安全性問題不是數(shù)據(jù)庫系統(tǒng)所獨有的,所有計算機系統(tǒng)都有這個問題。數(shù)據(jù)庫系統(tǒng)中大量數(shù)據(jù)集中存放,且為許多最終用戶直接共享,安全性問題更為突出。9.1.1數(shù)據(jù)庫安全的基本概念9.1.2安全標準9.1.3SQL存取控制機制9.1.4審計機制9.1.1數(shù)據(jù)庫安全的基本概念數(shù)據(jù)庫安全保護目標是確保只有授權用戶才能訪問數(shù)據(jù)庫,未被授權的人員則無法接近數(shù)據(jù)。安全措施是指計算機系統(tǒng)中用戶直接或通過應用程序訪問數(shù)據(jù)庫所要經過的安全認證過程。數(shù)據(jù)庫安全認證過程如圖9-1所示9.1.1數(shù)據(jù)庫安全的基本概念用戶標識與鑒別(identification&authentication)當用戶訪問數(shù)據(jù)庫時,要先將其用戶名(username)與密碼(password)提交給數(shù)據(jù)庫管理系統(tǒng)進行認證;只有在確定其身份合法后,才能進入數(shù)據(jù)庫進行數(shù)據(jù)存取操作。數(shù)據(jù)庫安全保護通過身份認證的用戶,擁有了進入數(shù)據(jù)庫的“憑證”;用戶在數(shù)據(jù)庫中執(zhí)行什么操作,需通過“存取控制”或視圖進行權限分配。9.1.1數(shù)據(jù)庫安全的基本概念存取控制:決定用戶對數(shù)據(jù)庫中的哪些對象進行操作,進行何種操作。存取控制機制主要包括兩部分:定義用戶權限及將用戶權限登記到數(shù)據(jù)字典中;合法權限檢查:當用戶發(fā)出操作請求后,DBMS查找數(shù)據(jù)字典并根據(jù)安全規(guī)則進行合法權限檢查,若操作請求超出了定義的權限,系統(tǒng)將拒絕執(zhí)行此操作。視圖:通過為不同的用戶定義不同的視圖,達到限制用戶訪問范圍的目的。視圖機制能隱藏用戶無權存取的數(shù)據(jù),從而自動地對數(shù)據(jù)庫提供一定程度的安全保護;視圖的主要功能在于提供數(shù)據(jù)庫的邏輯獨立性,其安全性保護不太精細,往往不能達到應用系統(tǒng)的要求;在實際應用中,通常將視圖與存取控制機制結合起來使用,如先通過視圖屏蔽一部分保密數(shù)據(jù),然后進一步定義存取權限。9.1.1數(shù)據(jù)庫安全的基本概念審計:是一種監(jiān)視措施,用于跟蹤并記錄有關數(shù)據(jù)的訪問活動。審計追蹤把用戶對數(shù)據(jù)庫的所有操作自動記錄下來,存放在審計日志(auditlog)中;審計日志的內容一般包括:操作類型(如修改、查詢、刪除);操作終端標識與操作者標識;操作日期和時間;操作所涉及到的相關數(shù)據(jù)(如基本表、視圖、記錄、屬性);數(shù)據(jù)庫的前映像(即修改前的值)和后映像(即修改后的值)。利用這些信息,可找出非法存取數(shù)據(jù)庫的人、時間和內容等;數(shù)據(jù)庫管理系統(tǒng)往往將審計作為可選特征,允許操作者打開或關閉審計功能。9.1.1數(shù)據(jù)庫安全的基本概念操作系統(tǒng)安全保護通過操作系統(tǒng)提供的安全措施來保證數(shù)據(jù)庫的安全性數(shù)據(jù)密碼存儲訪問控制和存取控制可將用戶的應用系統(tǒng)訪問范圍最小化和數(shù)據(jù)對象操作權限最低化,但對一些敏感數(shù)據(jù)進行“加密存儲”也是系統(tǒng)提供的安全策略;數(shù)據(jù)加密(dataencryption):防止數(shù)據(jù)庫中數(shù)據(jù)存儲和傳輸失密的有效手段;加密的基本思想:先根據(jù)一定的算法將原始數(shù)據(jù)(即明文,plaintext)加密為不可直接識別的格式(即密文,ciphertext),然后數(shù)據(jù)以密文的方式存儲和傳輸。9.1.3SQL存取控制機制

SQL支持受控的存取保護:在自主存取控制中,用戶對不同的數(shù)據(jù)對象有不同的存取權限;不同的用戶對同一對象有不同的權限;用戶可將其擁有的存取權限轉授給其他用戶。自主存取控制通過SQL的GRANT和REVOKE語句實現(xiàn)。用戶權限:是指用戶可以在哪些數(shù)據(jù)對象上進行哪些類型的操作。它由兩個要素組成:數(shù)據(jù)對象和操作類型。定義存取權限稱為授權(authorization);授權粒度可以精細到字段級,也可以粗到關系級;授權粒度越細,授權子系統(tǒng)就越靈活,但是系統(tǒng)的開銷也會相應地增大。9.1.3SQL存取控制機制

授權分為數(shù)據(jù)庫級、表級和列級權限。在SQLServer中權限只能由擔任不同角色的用戶來分配;不同類型的用戶有不同的等級;下圖給出了授權等級圖。9.1.3SQL存取控制機制

GRANT和REVOKE語句向用戶授予或收回對數(shù)據(jù)的操作權限。對數(shù)據(jù)庫模式的授權則由DBA在創(chuàng)建用戶時實現(xiàn)。創(chuàng)建用戶的語法如下:

CREATEUSER

<username>

[WITH][DBA|RESOURCE|CONNECT]該語法在SQLServer2000中不支持;在SQLServer2000中使用系統(tǒng)存儲過程sp_addlogin和sp_adduser實現(xiàn),詳見實驗教材。9.1.3SQL存取控制機制

權限的授予與收回GRANT和REVOKE有兩種權限:目標權限和命令權限。命令權限的授予與收回主要指DDL操作權限,語法分別為:

GRANT{all|<command_list>}TO{public|<username_list>}

REVOKE{all|<command_list>}FROM{public|<username_list>}<command_list>可以是createdatabase、createdefault、createfunction、createprocedure、createrule、createtable、createview、createindex、backupdatabase和backuplog等;一次可授多種權限,授多種權限時,權限之間用逗號分隔;如果具有創(chuàng)建對象的create權限,則自動具有其創(chuàng)建對象的修改權限alter和刪除權限drop;9.1.3SQL存取控制機制

對于基本表,自動具有在所創(chuàng)建表上創(chuàng)建、刪除和修改觸發(fā)器的權限;修改alter和刪除權限drop不額外授權;all:表示上述所有權限;public:表示所有的用戶;<username_list>:指定的用戶名列表。如果將某組權限同時授予多個用戶,則用戶名之間用逗號分隔。[例9.1]將創(chuàng)建表和視圖的權限授予user01和user02用戶:GRANTcreatetable,createviewTOuser01,user02[例9.2]從user02收回創(chuàng)建視圖的權限:REVOKEcreateviewFROMuser029.1.3SQL存取控制機制

目標權限的授予和收回主要指DML操作權限,語法分別為:GRANT{all|<command_list>}ON<objectName>

[(<columnName_list>)]

TO{public|<username_list>}[WITHGRANTOPTION]

REVOKE{all|<command_list>}ON<objectName>[(<columnName_list>)]

FROM{public|<username_list>}[CASCADE|RESTRICT]<command_list>可以是update、select、insert、delete、excute和allexcute針對存儲過程授予執(zhí)行權限;update、select、insert、delete針對基本表和視圖授權;all表示所有的權限。對象的創(chuàng)建者自動擁有該對象的插入、刪除、更新和查詢操作權限;過程的創(chuàng)建者自動擁有所創(chuàng)建過程的執(zhí)行權限;9.1.3SQL存取控制機制CASCADE:級聯(lián)收回;RESTRICT:缺省值,若轉賦了權限,則不能收回;WITHGRANTOPTION:允許將指定對象上的目標權限授予其它安全帳戶。不允許循環(huán)授權,即不允許將得到的權限授予其祖先,如下圖所示:9.1.3SQL存取控制機制[例9.3]將存儲過程proSearchBySno的執(zhí)行權限授予用戶u1、u2和u3:GRANTexcuteONproSearchBySnoTO

u1,u2,u3[例9.4]將對班級表Class的查詢、插入權限授予用戶u1,且用戶u1可以轉授其所獲得的權限給其它用戶:GRANTselect,insertONClassTO

u1WITHGRANTOPTION[例9.5]將對學生表的性別、出生日期的查詢和修改權限授予用戶u3、u4和u5,且不可以轉授權限:

GRANTselect,updateONStudent(sex,birthday)TO

u3,u4,u5如果是對列授予權限,命令項可以包括select或update或兩者組合;若使用了select*

,則必須對表的所有列賦予select權限。9.1.3SQL存取控制機制[例9.6]將表Score的若干權限分別授予用戶u1、u2、u3、u4、u5和u6。將表Score的所有權限授予用戶u1,且可以轉授權限GRANTallONScoreTO

u1WITHGRANTOPTION用戶u1將表Score的所有權限授予用戶u2,且可以轉授權限GRANTallONScoreTO

u2WITHGRANTOPTION用戶u2將表Score的查詢和插入權限授予用戶u5,且不可以轉授GRANTselect,insertONScoreTO

u5用戶u2將表Score的所有權限授予用戶u4,且可以轉授權限GRANTallONScoreTO

u4WITHGRANTOPTION用戶u4將表Score的查詢和刪除權限授予用戶u6,且可以轉授GRANTselect,deleteONScoreTOu6WITHGRANTOPTION通過上述的授權,用戶u1、u2、u3、u4、u5和u6分別得到的權限如下圖所示:9.1.3SQL存取控制機制[例9.7]用戶u2將轉授給用戶u4的對表Score的修改和查詢權限收回:REVOKEselect,updateONScoreFROM

u4CASCADE本例必須級聯(lián)收回,因為u4將該表的查詢和刪除權限轉授給了u6。[例9.8]用戶u4將轉授給用戶u6的對表Score的查詢權限收回:REVOKEselectONScoreFROMu6數(shù)據(jù)庫角色被命名的一組與數(shù)據(jù)庫操作相關的權限;角色是權限的集合,可以為一組具有相同權限的用戶創(chuàng)建一個角色;角色簡化了授權操作。9.1.3SQL存取控制機制角色的創(chuàng)建、授權、轉授和收回語句的語法如下:角色的創(chuàng)建,在SQLServer2000中,使用系統(tǒng)存儲過程sp_addrole創(chuàng)建角色:

sp_addrole<roleName>給角色授權:GRANT{all|<command_list>}ON<objectName>TO<roleName_list>將角色授予其他的角色或用戶:GRANT<roleName_list>TO<roleName_list>|<username_list>[WITHADMINOPTION]角色權限的收回:REVOKE{all|<command_list>}ON<objectName>FROM<roleName_list>從角色或用戶中收回角色:REVOKE<roleName>FROM{<roleName_list>|<username_list>}9.1.3SQL存取控制機制[例9.9]通過角色實現(xiàn)將一組權限授予一個用戶。創(chuàng)建一個角色R1:sp_addrole

R1使用GRANT語句,使角色R1擁有Student表的select、update、insert權限:GRANTselect,update,insertONStudentTO

R1將角色R1授予用戶u1、u2和u3,使他們具有角色R1所包含的全部權限:GRANT

R1TOu1,u2,u3通過角色R1可以一次性地收回已授予用戶u1的這3個權限:REVOKE

R1FROM

u19.1.3SQL存取控制機制[例9.10]將對表Student的刪除權限授予角色R1,并收回查詢權限。

GRANTdeleteONStudentTO

R1

REVOKEselectONStudentFROM

R1通過修改角色的權限,一次性地將用戶u2和u3的權限全部修改了。目錄9.4數(shù)據(jù)庫安全性

9.1數(shù)據(jù)庫完整性

9.29.3游標

存儲過程觸發(fā)器應用與安全設計

9.59.69.2

數(shù)據(jù)庫完整性

數(shù)據(jù)庫系統(tǒng)在運行過程中,用戶無論通過什么方式對數(shù)據(jù)庫中的數(shù)據(jù)進行操作,都必須保證數(shù)據(jù)的正確性。如,在學生成績管理數(shù)據(jù)庫ScoreDB中,必須保證學生表Student中的學號是唯一的,性別只能取“男”和“女”;在學生成績表Score中,課程成績必須在0~100分之間,且學號必須在Student表中存在(即只有是本校的學生才可以選課),等等。數(shù)據(jù)庫的完整性是針對數(shù)據(jù)庫中的數(shù)據(jù)進行正確性的維護,防止數(shù)據(jù)庫中存在不符合語義、不正確的數(shù)據(jù)。9.2

數(shù)據(jù)庫完整性

為維護數(shù)據(jù)庫的完整性,數(shù)據(jù)庫管理系統(tǒng)提供:完整性約束條件定義完整性約束條件也稱為完整性規(guī)則,是數(shù)據(jù)庫中的數(shù)據(jù)必須滿足的語義約束條件;由SQL的DDL實現(xiàn),作為模式的一部分存入數(shù)據(jù)庫中。完整性檢查方法檢查數(shù)據(jù)是否滿足已定義的完整性約束條件稱為完整性檢查;一般在insert、delete、update執(zhí)行后開始檢查,或事務提交時進行檢查。違約處理若發(fā)現(xiàn)用戶操作違背了完整性約束條件,應采取一定的措施,如拒絕操作等。商用DBMS都支持完整性控制。定義數(shù)據(jù)庫模式時,除了非常復雜的約束外,都可以很明確地對完整性約束加以說明。9.2

數(shù)據(jù)庫完整性

9.2.1完整性約束條件9.2.2實體完整性9.2.3參照完整性9.2.4用戶自定義完整性9.2.5完整性約束的修改9.2.1完整性約束條件完整性約束條件作用的對象可以是關系、元組、列三種:列約束主要是列的類型、取值范圍、精度、是否允許空值等的約束條件;元組約束是元組中屬性間聯(lián)系的約束;關系約束是若干元組間、關系集合上以及關系之間的聯(lián)系的約束。完整性約束,其狀態(tài)可是靜態(tài)的,也可是動態(tài)的。靜態(tài)約束:指數(shù)據(jù)庫每一確定狀態(tài)時的數(shù)據(jù)對象所應滿足的約束條件。反映數(shù)據(jù)庫狀態(tài)合理性的約束;靜態(tài)約束主要表現(xiàn)在:9.2.1完整性約束條件靜態(tài)列級約束:對列的取值域的說明,包括以下幾方面:對數(shù)據(jù)類型的約束,包括數(shù)據(jù)的類型、長度、單位、精度等;對數(shù)據(jù)格式的約束;對取值范圍或取值集合的約束;對空值的約束;其他約束。靜態(tài)元組約束:規(guī)定元組的各個列之間的約束關系。靜態(tài)關系約束:在一個關系的各個元組之間或者若干關系之間常存在各種聯(lián)系或約束。常見的靜態(tài)關系約束有:實體完整性約束;參照完整性約束;函數(shù)依賴約束,大部分函數(shù)依賴約束都在關系模式中定義;統(tǒng)計約束,即字段值與關系中多個元組的統(tǒng)計值之間的約束關系.9.2.1完整性約束條件動態(tài)約束:指數(shù)據(jù)庫從一種狀態(tài)轉變?yōu)榱硪环N狀態(tài)時的新、舊值之間所應滿足的約束條件。反映數(shù)據(jù)庫狀態(tài)變遷的約束;動態(tài)約束主要表現(xiàn)在:動態(tài)列級約束:修改列定義或列值時應滿足的約束條件。修改列定義時的約束。如,將允許空值的列改為不允許空值時,如果該列已存在空值,則拒絕這種修改。修改列值時的約束。修改列值有時需要參照其舊值,并且新舊值之間需要滿足某種約束條件。例如,職工工資調整不得低于其原來工資,學生年齡只能增長等。9.2.1完整性約束條件動態(tài)元組約束:指修改元組的值時元組中各個字段間需要滿足某種約束條件。例如,職工工資調整時新工資不得低于原工資+工齡*1.5等。動態(tài)關系約束:動態(tài)關系約束是加在關系變化前后狀態(tài)上的限制條件。例如,事務一致性、原子性等約束條件。完整性約束又分為立即執(zhí)行的約束和延遲執(zhí)行的約束:立即執(zhí)行約束(immediateCONSTRAINTS):檢查是否違背完整性約束的時機是在一條語句執(zhí)行完后立即檢查。延遲執(zhí)行約束(deferredCONSTRAINTS):需要延遲到整個事務執(zhí)行結束后再進行檢查。9.2.1完整性約束條件在SQL中,所有的完整性約束,用戶既可以對其命名(使用CONSTRAINT),也可由具體的數(shù)據(jù)庫系統(tǒng)取默認的名字。如果是用戶所命名的約束,修改約束時比較方便;如果由系統(tǒng)自動給約束命名,則必須通過訪問系統(tǒng)的數(shù)據(jù)字典查到相應的約束名稱,才可以對其進行修改。9.2.2實體完整性實體完整性要求基本表的主碼值唯一且不允許為空值。在SQL中:實體完整性定義使用CREATETABLE語句中的PRIMARYKEY短語實現(xiàn);或使用ALTERTABLE語句中的ADDPRIMARYKEY短語實現(xiàn);有關CREATETABLE、ALTERTABLE語句的語法詳見第3章3.8節(jié)(P112~115)。對單屬性構成的主碼可定義為列級約束,也可定義為表級約束;對多個屬性構成的主碼,只能定義為表級約束。9.2.2實體完整性實體完整性定義[例9.11]在班級表Class中將classNo定義為主碼。CREATETABLEClass(

classNo char(6) NOTNULL,--班級號

classNamevarchar(30)uniqueNOTNULL,--班級名

institutevarchar(30)NOTNULL,--所屬學院

gradesmallintdefault0NOTNULL,--年級

classNumtinyint NULL,--班級人數(shù)

CONSTRAINTClassPKPRIMARYKEY(classNo))本例將classNo定義為主碼,使用CONSTRAINT短語為該約束命名為ClassPK;該主碼定義為表級約束。9.2.2實體完整性該例還可按下面的方式定義:CREATETABLEClass(

classNochar(6)NOTNULLPRIMARYKEY,--班級號

...)將主碼classNo定義為列級約束,且由系統(tǒng)取約束名稱??蔀榧s束取名,如:CREATETABLEClass(

classNo char(6) NOTNULL--班級號

CONSTRAINTClassPKPRIMARYKEY,...)將主碼classNo定義為列級約束,且約束取名為ClassPK。9.2.2實體完整性[例9.12]在學生成績表Score中將studentNo、courseNo定義為主碼。CREATETABLEScore(

studentNochar(7) NOTNULL,--學號

courseNochar(3) NOTNULL,--課程號

score numeric(5,1)default0NOTNULL,--成績

/*主碼由兩個屬性構成,必須作為表級完整性進行定義*/

CONSTRAINTScorePKPRIMARYKEY(studentNo,courseNo))也可以寫成:CREATETABLEScore(

studentNochar(7) NOTNULL,--學號

courseNochar(3) NOTNULL,--課程號

score numeric(5,1)default0NOTNULL,--成績

/*主碼由兩個屬性構成,必須作為表級完整性進行定義*/

PRIMARYKEY(studentNo,courseNo))由系統(tǒng)自動為約束取名。9.2.2實體完整性實體完整性的檢查和違約處理當插入或對主碼列進行更新操作時,數(shù)據(jù)庫管理系統(tǒng)按照實體完整性規(guī)則自動進行檢查,包括:檢查主碼值是否唯一,如果不唯一則拒絕插入或修改;檢查主碼值的唯一性,可采用全表掃描或B+樹索引掃描。全表掃描法:從外存依次將該表的每一數(shù)據(jù)塊讀入內存;判斷塊中的每一條記錄的主碼值與待插入(或修改)記錄的主碼值是否相同;如果相同,則阻止插入(或修改)!全表掃描法如圖9-6所示:9.2.2實體完整性全表掃描法十分耗費系統(tǒng)資源。數(shù)據(jù)庫管理系統(tǒng)一般對主碼建立一個B+樹索引。通過掃描索引來查找基本表中是否存在相同的主碼值。B+樹索引掃描法如圖9-7所示:9.2.2實體完整性采用B+樹將極大地提高系統(tǒng)效率:查找的結點數(shù)僅為B+樹的高度;使用B+樹索引提高了查找速度,但增加了索引的維護代價。如果插入或修改的主碼值在索引中不存在,系統(tǒng)需要動態(tài)維護索引。檢查主碼的各個屬性是否為空,只要有一個為空則拒絕插入或修改。9.2.3參照完整性

參照完整性為若干個表中的相應元組建立聯(lián)系。在SQL中:參照完整性定義使用CREATETABLE語句中的FOREIGNKEY和REFERENCES短語來實現(xiàn);或通過使用ALTERTABLE語句中的ADDFOREIGNKEY短語來實現(xiàn);FOREIGNKEY指出定義哪些列為外碼;REFERENCES短語指明這些外碼參照哪些關系;給出FOREIGNKEY定義的關系稱為參照關系;由REFERENCES指明的表稱為被參照關系。9.2.3參照完整性

參照完整性的定義[例9.13]在學生成績表Score中將studentNo、courseNo定義為外碼。CREATETABLEScore(

studentNochar(7) NOTNULL,--學號

courseNochar(3) NOTNULL,--課程號

score numeric(5,1)default0NOTNULL--成績

CHECK(scoreBETWEEN0.0AND100.0),

/*主碼由兩個屬性構成,必須作為表級完整性進行定義*/

CONSTRAINTScorePKPRIMARYKEY(studentNo,courseNo),/*表級完整性約束條件,studentNo是外碼,被參照表是Student*/

CONSTRAINTScoreFK1FOREIGNKEY(studentNo)

REFERENCESStudent(studentNo),/*表級完整性約束條件,courseNo是外碼,被參照表是Course*/

CONSTRAINTScoreFK2FOREIGNKEY(courseNo)

REFERENCESCourse(courseNo))9.2.3參照完整性

本例中,Score為參照表,Student和Course為被參照表。Score中studentNo屬性列參照Student的studentNo列,其含義為:Score中studentNo列的取值必須是Student中studentNo列的某個屬性值;即不存在一個未注冊的學生選修了課程。Score中courseNo屬性列參照Course的courseNo列,其含義為:Score中courseNo列的取值必須是Course中courseNo列的某個屬性值;即不存在學生選修了一門不存在的課程。本例也可改寫為:

CREATETABLEScore(.../*表級完整性約束條件,studentNo是外碼,被參照表是Student*/

FOREIGNKEY(studentNo)REFERENCESStudent(studentNo),/*表級完整性約束條件,courseNo是外碼,被參照表是Course*/

FOREIGNKEY(courseNo)REFERENCESCourse(courseNo))外碼約束由系統(tǒng)自動命名。9.2.3參照完整性

在實現(xiàn)參照完整性時,提供定義外碼列是否允許空值的機制:如果外碼是主碼的一部分,則外碼不允許為空值;本例的兩個外碼皆不允許為空值。參照完整性的檢查和違約處理違約處理的策略如下:拒絕(NOACTION)執(zhí)行,是系統(tǒng)的默認策略:當在被參照關系中刪除元組時,僅當參照關系中沒有任何元組的外碼值與被參照關系中要刪除元組的主碼值相同時,系統(tǒng)才執(zhí)行刪除操作,否則拒絕此操作。如要刪除學生表Student中學號為“0700001”的記錄,系統(tǒng)不允許,因為學號為“0700001”的同學在成績表Score中選修了課程。參照關系中可以隨意刪除元組。9.2.3參照完整性當在參照關系中修改元組時,僅當參照關系中修改后的元組的外碼值依然在被參照關系中,系統(tǒng)才執(zhí)行修改操作,否則拒絕。如在成績表Score中修改“0700001”同學的學號為“0700006”,系統(tǒng)不允許,因為學號“0700006”同學在學生表Student中不存在。在被參照關系中修改元組:僅當被參照關系中修改前的元組的主碼值沒有出現(xiàn)在參照關系的外碼中,系統(tǒng)才執(zhí)行修改操作,否則拒絕該操作。如在學生表Student中修改“0700001”同學的學號為“0700006”,系統(tǒng)不允許,因為學號“0700001”同學在選課表Scoret中已經選修了課程.在參照關系中插入元組:僅當參照關系中插入的元組的外碼值等于被參照關系中某個元組的主碼值時,系統(tǒng)才執(zhí)行插入操作,否則拒絕該操作。如在成績表Score中插入一條記錄“0700006,001,78”,系統(tǒng)不允許,因為學號“0700006”同學在學生表Student中不存在。被參照關系可以隨意插入新元組。9.2.3參照完整性級聯(lián)(CASCADE)操作。當刪除或修改被參照關系的某些元組造成了與參照關系的不一致時,則刪除或修改參照表中所有不一致的元組。例如,刪除學生表Student中學號為“0700001”的記錄,則自動刪除被參照關系成績表Score中學號為“0700001”的所有選課記錄。修改學生表Student中的學號,由“0700001”改為“0700006”,則自動修改被參照關系成績表Score中學號為“0700001”的所有選課記錄,將“0700001”全部改為“0700006”。級聯(lián)(CASCADE)操作必須在定義外碼時給出顯示定義。設置為空值(SETNULL):對于參照完整性,除了定義外碼,還應定義外碼列是否允許空值。如果外碼是主碼的一部分,則外碼不允許為空值。置空值刪除(NULLIFIES):刪除被參照關系的元組,并將參照關系中相應元組的外碼值置空值.9.2.3參照完整性

[例9.14]在學生成績表Score中將studentNo、courseNo定義為外碼,且studentNo外碼定義為級聯(lián)刪除和修改操作,courseNo外碼定義為級聯(lián)修改操作。

CREATETABLEScore(

studentNochar(7) NOTNULL,--學號

courseNochar(3) NOTNULL,--課程號

score numeric(5,1)default0NOTNULL,--成績

/*主碼由兩個屬性構成,必須作為表級完整性進行定義*/

CONSTRAINTScorePKPRIMARYKEY(studentNo,courseNo),

/*表級完整性約束條件,studentNo是外碼,被參照表是Student*/

CONSTRAINTScoreFK1FOREIGNKEY(studentNo)

REFERENCESStudent(studentNo)

ONDELETE

CASCADE

/*級聯(lián)刪除Score表中相應的元組*/

ONUPDATECASCADE,

/*級聯(lián)更新Score表中相應的元組*/9.2.3參照完整性/*表級完整性約束條件,courseNo是外碼,被參照表是Course*/

CONSTRAINTScoreFK2FOREIGNKEY(courseNo)

REFERENCESCourse(courseNo)

ONDELETENOACTION

/*該定義為默認值,可以不定義*/

/*當更新course表中的courseNo時,級聯(lián)更新Score表中相應的元組*/

ONUPDATECASCADE)9.2.4用戶自定義完整性用戶自定義完整性就是定義某一具體應用中數(shù)據(jù)必須滿足的語義要求,由RDBMS提供,而不必由應用程序承擔。用戶自定義完整性包括屬性上的約束和元組上的約束兩種。屬性上的約束屬性上的約束包括:列值非空、列值唯一、設置默認值、滿足CHECK(<predicate>)定義等;屬性上的約束是當往表中插入或修改屬性值時,系統(tǒng)檢查是否滿足約束條件,如果不滿足,則拒絕相應的操作。9.2.4用戶自定義完整性

[例9.15]在學生表Student中定義屬性studentNo取值必須為數(shù)字,性別只能取‘男’或‘女’,民族缺省值為‘漢族’。CREATETABLEStudent(

studentNochar(7)NOTNULL

CHECK(studentNoLIKE'[0-9][0-9][0-9][0-9][0-9][0-9][0-9]'),

--學號,由7位數(shù)字組成

studentName varchar(20)NOTNULL,--姓名,不允許為空值/*性別,允許為空值,僅取男或女兩個值*/sex char(2) NULLCHECK(sexIN

('男','女')),birthdaydatetime NULL,--出生日期,允許為空值

nativevarchar(20)NULL,--籍貫,允許為空值

nation varchar(30)default'漢族'NULL,

--民族,允許為空值,默認“漢族”

classNo char(6) NULL,

--所屬班級,允許為空值

CONSTRAINTStudentPKPRIMARYKEY(studentNo),

CONSTRAINTStudentFKFOREIGNKEY(classNo)

REFERENCESClass(classNo))9.2.4用戶自定義完整性[例9.16]在班級表中定義班級名稱唯一。CREATETABLEClass(classNo char(6)NOTNULL,

--班級號,不允許為空值

/*班級名,必須唯一,不允許為空值*/

classNamevarchar(30)uniqueNOTNULL,institutevarchar(30)NOTNULL,

--所屬學院,不允許為空值/*年級,默認值為0,不允許為空值*/gradesmallintdefault0NOTNULL,

classNumtinyint NULL,--班級人數(shù),允許為空值

CONSTRAINTClassPKPRIMARYKEY(classNo))9.2.4用戶自定義完整性元組上的約束元組上的約束可以設置不同屬性之間的取值的相互約束條件;用短語CHECK(<predicate>)引出的約束;插入元組或修改屬性的值時,RDBMS檢查元組上的約束條件是否被滿足,如果不滿足則操作被拒絕執(zhí)行。[例9.17]在學生表Student中定義:如果是男同學,則其姓名不能以劉開頭

CREATETABLEStudent(..../*性別,允許為空值,僅取男和女兩個值*/

sex char(2) NULLCHECK(sexIN

(‘男’,‘女’)),

--列約束

...--以下是元組約束

CONSTRAINTSexCKCHECK(sex='女'ORstudentNameNOTLIKE'劉%'),...)本例給出了性別sex屬性列與姓名studentName屬性列之間必須滿足的約束條件9.2.4用戶自定義完整性屬性級與元組級約束在定義上的區(qū)別如果在定義屬性的同時定義約束條件,則為列級約束;如果單獨定義約束條件,則為元組級的約束。[例9.18]列級約束CREATETABLEStudent(

sNo

char(5)NOTNULL--學號/*列級主碼約束和列級用戶自定義約束*/

CHECK

(sNoLIKE'[0-9][0-9][0-9][0-9][0-9]')PRIMARYKEY,sNamechar(10)NULLunique,

--姓名,列級唯一約束sSex

char(2)

NULL,

--性別sDatedatetimeNULL,

--出生日期sAge

tinyintDEFAULT17NOTNULL--年齡,列級約束

CHECK(sAge>0

AND

sAge<60),sMZ

char(10)NULL,

--民族

sDeptchar(2)NOTNULL,

--所在系sTotaldecimal(8,2)DEFAULT0.00NOTNULL--總分)9.2.4用戶自定義完整性[例9.19]元組級約束。CREATETABLEStudent(sNochar(5)NOTNULL,

--學號

--元組級約束

CONSTRAINTsNoCKCHECK

(sNoLIKE'[0-9][0-9][0-9][0-9][0-9]'),sNamechar(10)NULLUNIQUE,

--姓名

sSexchar(2)NULL,--性別

sDatedatetimeNULL,--出生日期

sAgetinyintDEFAULT17NOTNULL,--年齡

sMZchar(10)NULL,--民族

sDeptchar(2)NOTNULL,--所在系

sTotaldecimal(8,2)DEFAULT0.00NOTNULL,--總分

CONSTRAINTageCKCHECK(sAge>0ANDsAge<60),--元組級約束

PRIMARYKEY(sNo)--元組級約束)9.2.5完整性約束的修改用戶可以為完整性約束命名,命名格式如下:[CONSTRAINT<constraintName>]

PRIMARYKEY

(<constraintExpr>)[CONSTRAINT<constraintName>]

FOREIGNKEY

(<constraintExpr>)REFERENCE<refTable>(<constraintExpr>)

[CONSTRAINT<constraintName>]

CHECK

(<constraintExpr>)用戶命名有兩點好處:一是便于理解約束的含義;二是修改約束方便,不必查詢數(shù)據(jù)字典。使用ALTERTABLE語句修改表中的完整性約束。要修改約束,首先必須刪除約束,然后加入新的約束。9.2.5完整性約束的修改刪除約束:ALTERTABLE<tableName>

DROPCONSTRAINT<constraintName>添加約束:ALTERTABLE<tableName>

ADDCONSTRAINT<constraintName>

<CHECK|UNIQUE|PRIMARYKEY|FOREIGNKEY>(<constraintExpr>)其中<tableName>為欲修改約束所在的表名;<constraintName>為欲修改的約束名稱。目錄9.4數(shù)據(jù)庫安全性

9.1數(shù)據(jù)庫完整性

9.29.3游標

存儲過程觸發(fā)器應用與安全設計

9.59.69.4存儲過程存儲過程是為了完成特定功能匯集而成的一組命名了的SQL語句集合該集合編譯后存放在數(shù)據(jù)庫中,可根據(jù)實際情況重新編譯;存儲過程可直接運行,也可遠程運行;存儲過程直接在服務器端運行。使用存儲過程具有如下優(yōu)點:將業(yè)務操作封裝可為復雜的業(yè)務操作編寫存儲過程,放在數(shù)據(jù)庫中;用戶可調用存儲過程執(zhí)行,而業(yè)務操作對用戶是不可見的;若存儲過程僅修改了執(zhí)行體,沒有修改接口(即調用參數(shù)),則用戶程序不需要修改,達到業(yè)務封裝的效果。便于事務管理事務控制可以用在存儲過程中;用戶可依據(jù)業(yè)務的性質定義事務,并對事務進行相應級別的操作。9.4存儲過程

實現(xiàn)一定程度的安全性保護存儲過程存放在數(shù)據(jù)庫中,且在服務器端運行;對于不允許用戶直接操作的表或視圖,可通過調用存儲過程來間接地訪問這些表或視圖,達到一定程度的安全性;這種安全性緣于用戶對存儲過程只有執(zhí)行權限,沒有查看權限;擁有存儲過程的執(zhí)行權限,自動獲取了存儲過程中對相應表或視圖的操作權限;這些操作權限僅能通過執(zhí)行存儲過

溫馨提示

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

評論

0/150

提交評論