數(shù)據(jù)庫(kù)系統(tǒng)原理與設(shè)計(jì)實(shí)驗(yàn)教程 第4版 課件 第4章 數(shù)據(jù)庫(kù)安全性與完整性_第1頁(yè)
數(shù)據(jù)庫(kù)系統(tǒng)原理與設(shè)計(jì)實(shí)驗(yàn)教程 第4版 課件 第4章 數(shù)據(jù)庫(kù)安全性與完整性_第2頁(yè)
數(shù)據(jù)庫(kù)系統(tǒng)原理與設(shè)計(jì)實(shí)驗(yàn)教程 第4版 課件 第4章 數(shù)據(jù)庫(kù)安全性與完整性_第3頁(yè)
數(shù)據(jù)庫(kù)系統(tǒng)原理與設(shè)計(jì)實(shí)驗(yàn)教程 第4版 課件 第4章 數(shù)據(jù)庫(kù)安全性與完整性_第4頁(yè)
數(shù)據(jù)庫(kù)系統(tǒng)原理與設(shè)計(jì)實(shí)驗(yàn)教程 第4版 課件 第4章 數(shù)據(jù)庫(kù)安全性與完整性_第5頁(yè)
已閱讀5頁(yè),還剩47頁(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頁(yè)第4章數(shù)據(jù)庫(kù)安全性與完整性數(shù)據(jù)庫(kù)系統(tǒng)原理實(shí)驗(yàn)教程第4版4.1相關(guān)知識(shí)4.1.1數(shù)據(jù)庫(kù)安全性4.1.2數(shù)據(jù)庫(kù)完整性4.2實(shí)驗(yàn)十安全性定義與檢查4.2.1實(shí)驗(yàn)?zāi)康呐c要求4.2.2實(shí)驗(yàn)案例4.2.3實(shí)驗(yàn)內(nèi)容4.3實(shí)驗(yàn)十一完整性定義與檢查4.3.1實(shí)驗(yàn)?zāi)康呐c要求4.3.2實(shí)驗(yàn)案例4.3.3實(shí)驗(yàn)內(nèi)容目錄第3頁(yè)數(shù)據(jù)庫(kù)的安全性是指保護(hù)數(shù)據(jù)庫(kù)以防止不合法的使用所造成的數(shù)據(jù)泄密、更改或破壞。數(shù)據(jù)庫(kù)的完整性約束是指數(shù)據(jù)的正確性與相容性,是為了防止數(shù)據(jù)庫(kù)存在不符合語(yǔ)義的數(shù)據(jù)第4頁(yè)4.1相關(guān)知識(shí)4.1.1數(shù)據(jù)庫(kù)安全性1.登錄賬號(hào)的管理登錄是通過(guò)帳號(hào)和口令訪問(wèn)SQLServer的數(shù)據(jù)庫(kù)。登錄SQLServer服務(wù)器時(shí),SQLServer有三個(gè)默認(rèn)的用戶登錄帳號(hào):sa、builtin\administrators和域名\administrator。(1)sa:SQLServer系統(tǒng)管理員登錄賬號(hào),該賬號(hào)擁有最高管理權(quán)限,可以執(zhí)行服務(wù)器范圍內(nèi)的所有權(quán)限。(2)builtin\administrators:一個(gè)Windows組賬號(hào),凡屬于該組的用戶賬號(hào)都可以作為SQLServer登錄賬號(hào)使用。(3)域名\administrator:一個(gè)Windows用戶賬號(hào),允許作為SQLServer登錄賬號(hào)使用。第5頁(yè)2.數(shù)據(jù)庫(kù)用戶的管理數(shù)據(jù)庫(kù)用戶有:

(1)dbo用戶:數(shù)據(jù)庫(kù)擁有者或數(shù)據(jù)庫(kù)創(chuàng)建者,dbo在其所擁有的數(shù)據(jù)庫(kù)中擁有所有的操作權(quán)限。dbo的身份可被重新分配給另一個(gè)用戶,系統(tǒng)管理員sa可作為其所管理的任何數(shù)據(jù)庫(kù)的dbo用戶。(2)guest用戶:如果guest用戶在數(shù)據(jù)庫(kù)存在,則允許任意一個(gè)登錄用戶作為guest用戶訪問(wèn)數(shù)據(jù)庫(kù),其中包括那些不是數(shù)據(jù)庫(kù)用戶的SQL服務(wù)器用戶。除系統(tǒng)數(shù)據(jù)庫(kù)master和臨時(shí)數(shù)據(jù)庫(kù)tempdb的guest用戶不能被刪除外,其他數(shù)據(jù)庫(kù)都可以將自己guest用戶刪除,以防止非數(shù)據(jù)庫(kù)用戶的登錄用戶對(duì)數(shù)據(jù)庫(kù)進(jìn)行訪問(wèn)。

(3)新建的數(shù)據(jù)庫(kù)用戶:用戶根據(jù)實(shí)際需要?jiǎng)?chuàng)建不同權(quán)限的數(shù)據(jù)庫(kù)用戶。第6頁(yè)3.數(shù)據(jù)庫(kù)角色的管理用戶自定義的數(shù)據(jù)庫(kù)角色有兩種類型:即標(biāo)準(zhǔn)角色和應(yīng)用程序角色。①標(biāo)準(zhǔn)角色通過(guò)對(duì)用戶權(quán)限等級(jí)的認(rèn)定而將用戶劃分為不用的用戶組,用戶屬于一個(gè)或多個(gè)角色,從而實(shí)現(xiàn)管理的安全性。②應(yīng)用程序角色是一種比較特殊的角色。當(dāng)我們打算讓某些用戶只能通過(guò)特定的應(yīng)用程序間接地存取數(shù)據(jù)庫(kù)中的數(shù)據(jù)而不是直接地存取數(shù)據(jù)庫(kù)數(shù)據(jù)時(shí),就應(yīng)該考慮使用應(yīng)用程序角色。當(dāng)某一用戶使用了應(yīng)用程序角色時(shí),他便放棄了已被賦予的所有數(shù)據(jù)庫(kù)專有權(quán)限,他所擁有的只是應(yīng)用程序角色被設(shè)置的角色。第7頁(yè)4.SQLServer的權(quán)限管理SQLServer權(quán)限分為三類:對(duì)象權(quán)限、語(yǔ)句權(quán)限、隱含權(quán)限。(1)對(duì)象權(quán)限對(duì)象權(quán)限是指用戶是否允許對(duì)數(shù)據(jù)庫(kù)中的表、視圖、存儲(chǔ)過(guò)程等對(duì)象的操作權(quán)限,其具體內(nèi)容如圖4-1所示。

第8頁(yè)(2)語(yǔ)句權(quán)限語(yǔ)句權(quán)限相當(dāng)于數(shù)據(jù)庫(kù)定義語(yǔ)言的語(yǔ)句權(quán)限,具體內(nèi)容如圖4-2所示。第9頁(yè)(3)隱含權(quán)限隱含權(quán)限是指由SQLServer預(yù)定義的服務(wù)器角色、數(shù)據(jù)庫(kù)所有者dbo、數(shù)據(jù)庫(kù)對(duì)象所有者所擁有的權(quán)限,它相當(dāng)于內(nèi)置權(quán)限,不需要明確地授予這些權(quán)限。權(quán)限管理的內(nèi)容有3方面:①授予權(quán)限。即允許某個(gè)用戶或角色對(duì)一個(gè)對(duì)象執(zhí)行某種操作或語(yǔ)句。②拒絕權(quán)限。即拒絕某個(gè)用戶或角色訪問(wèn)某個(gè)對(duì)象,即使某個(gè)用戶或角色被授予這種權(quán)限,仍然不允許執(zhí)行相應(yīng)的操作。③取消權(quán)限。即不允許某個(gè)用戶或角色對(duì)一個(gè)對(duì)象執(zhí)行某種操作或某種語(yǔ)句。不允許和拒絕是不同的,不允許還可以通過(guò)加入角色來(lái)獲得允許,而拒絕是無(wú)法通過(guò)角色來(lái)獲得允許的。三種權(quán)限沖突時(shí),拒絕權(quán)限起作用。第10頁(yè)4.1.2數(shù)據(jù)庫(kù)完整性數(shù)據(jù)庫(kù)的完整性主要包括:實(shí)體完整性、參照完整性、用戶自定義完整性。實(shí)體完整性要求基本表的主鍵值唯一且不允許為空值;參照完整性為若干個(gè)表中的相應(yīng)元組建立聯(lián)系;用戶自定義完整性就是針對(duì)某一具體應(yīng)用的數(shù)據(jù)必須滿足的語(yǔ)義要求,由RDBMS提供而不必由應(yīng)用程序承擔(dān)。第11頁(yè)1.SQLServer數(shù)據(jù)完整性分類SQLServer的數(shù)據(jù)完整性可分為3類,如表4-1所示。第12頁(yè)(1)實(shí)體完整性。實(shí)體完整性為表級(jí)完整性,它要求表中所有的元組都應(yīng)該有一個(gè)惟一的標(biāo)識(shí)符,這個(gè)標(biāo)識(shí)符就是平常所說(shuō)的主碼。(2)參照完整性。參照完整性是表級(jí)完整性,它維護(hù)參照表中的外碼與被參照表中主碼的相容關(guān)系。如果在被參照表中某一元組被外碼參照,那么這一行既不能被刪除,也不能更改其主碼。(3)用戶自定義完整性。用戶自定義完整性為列級(jí)和元組級(jí)完整性。它為列或列組指定一個(gè)有效的數(shù)據(jù)集,并確定該列是否允許為空。第13頁(yè)4.2實(shí)驗(yàn)十安全性定義與檢查4.2.1實(shí)驗(yàn)?zāi)康呐c要求掌握登錄賬號(hào)的創(chuàng)建、修改、刪除和禁止操作。掌握數(shù)據(jù)庫(kù)用戶的添加和刪除操作。掌握數(shù)據(jù)庫(kù)角色的創(chuàng)建、刪除;數(shù)據(jù)庫(kù)角色成員的添加和刪除。掌握權(quán)限管理中語(yǔ)句權(quán)限和對(duì)象權(quán)限的管理。掌握數(shù)據(jù)庫(kù)是如何進(jìn)行身份檢查和權(quán)限檢查的。熟練運(yùn)用數(shù)據(jù)庫(kù)的安全機(jī)制操作數(shù)據(jù)庫(kù)。第14頁(yè)4.2.2實(shí)驗(yàn)案例在SQLServe中,登錄賬號(hào)、數(shù)據(jù)庫(kù)用戶、數(shù)據(jù)庫(kù)角色以及權(quán)限的管理都可以通過(guò)企業(yè)管理器來(lái)完成,前面已經(jīng)講述。下面使用T-SQL語(yǔ)句來(lái)實(shí)現(xiàn)登錄賬號(hào)、數(shù)據(jù)庫(kù)用戶、數(shù)據(jù)庫(kù)角色以及權(quán)限的管理功能。1.登錄賬戶管理(1)創(chuàng)建登錄語(yǔ)法為:[EXECUTE]sp_addlogin[@loginame=]'login'[,[@passwd=]'password'][,[@defdb=]'database']第15頁(yè)其中:·@loginame='login':登錄名稱?!passw='password':登錄密碼,若不指定則默認(rèn)為NULL?!defdb='database':登錄后用戶訪問(wèn)的數(shù)據(jù)庫(kù),若不指定則默認(rèn)為master數(shù)據(jù)庫(kù)。在sp_addlogin中,除了登陸名稱之外,其余選項(xiàng)均為可選項(xiàng)。執(zhí)行sp_addlogin時(shí),必須具有相應(yīng)的權(quán)限。只有sysadmin和securityadmin固定服務(wù)器角色的成員才能執(zhí)行該命令。

第16頁(yè)[例4.1]創(chuàng)建用戶,要求如下:創(chuàng)建用戶為victoria,密碼為’p888888’的登錄賬號(hào)。創(chuàng)建用戶為u1,密碼為’p888888’的登錄賬號(hào)。創(chuàng)建用戶為u2,密碼為’p888888’的登錄賬號(hào)。sp_addlogin

‘victoria’,‘p888888'sp_addlogin

‘u1’,‘p888888'sp_addlogin

‘u2’,‘p888888’[例4.2]創(chuàng)建登錄賬號(hào)liu,密碼為liusjj999,默認(rèn)的數(shù)據(jù)庫(kù)為orderdb。sp_addlogin'liu','liusjj999','OrderDB'

第17頁(yè)(2)修改登錄賬號(hào)屬性修改登錄賬號(hào)的命令有:修改登錄密碼、修改默認(rèn)的數(shù)據(jù)庫(kù)和刪除賬號(hào)。修改登錄密碼語(yǔ)法:sp_password[[@old=]'old_password',]

{[@new=]'new_password'}

[,[@loginame=]'login']第18頁(yè)[例4.3]將liu的密碼修改為’p888888’。sp_password'liusjj999','p888888','liu'本例中,'liu'是登錄賬號(hào)名稱,'liusjj999'為'liu'原來(lái)的密碼,’p888888’是新密碼。(3)修改默認(rèn)的數(shù)據(jù)庫(kù)語(yǔ)法:sp_defaultdb[@loginame=]'login',[@defdb=]'database'[例4.4]將liu訪問(wèn)的數(shù)據(jù)庫(kù)修改為’ScoreDB’。sp_defaultdb'liu','ScoreDB'

第19頁(yè)(4)刪除登錄賬號(hào)語(yǔ)法:sp_droplogin@loginame='login‘[例4.5]刪除登錄賬號(hào)victoria。sp_droplogin'victoria'執(zhí)行上述語(yǔ)句后,'victoria'從登錄用戶中被刪除。第20頁(yè)2.用戶管理(1)添加用戶語(yǔ)法:sp_adduser

[@loginame=]'login'[,[@name_in_db=]'user']'其中,'login'是指登錄賬號(hào)名稱,'user'是指數(shù)據(jù)庫(kù)用戶名稱。[例4.6]為登錄賬號(hào)u1添加到OrderDB數(shù)據(jù)庫(kù)中,且用戶名為u1。sp_adduseru1,u1[例4.7]為登錄賬號(hào)u2添加到OrderDB數(shù)據(jù)庫(kù)中,且用戶名為uu2。sp_adduseru2,uu2

第21頁(yè)(2)刪除用戶語(yǔ)法:sp_dropuser[@name_in_db=]'user‘[例4.8]從當(dāng)前數(shù)據(jù)庫(kù)中刪除賬號(hào)u1。sp_dropuseru1

第22頁(yè)3.角色管理(1)創(chuàng)建數(shù)據(jù)庫(kù)角色語(yǔ)法:sp_addrole[@rolename=]'role'其中:‘role’指數(shù)據(jù)庫(kù)角色名稱,以下同義。只有固定服務(wù)器角色sysadmin、db_securityadmin及db_owner的成員才能執(zhí)行該系統(tǒng)存儲(chǔ)過(guò)程。[例4.9]建立角色r1和r2。sp_addrole'r1'sp_addrole'r2'

第23頁(yè)(2)刪除數(shù)據(jù)庫(kù)角色語(yǔ)法:sp_droprole[@rolename=]'role‘[例4.10]刪除數(shù)據(jù)庫(kù)角色r2。sp_droprole'r2'

第24頁(yè)(3)增加數(shù)據(jù)庫(kù)角色成員語(yǔ)法:sp_addrolemember[@rolename=]'role',[@membername=]'security_account'其中:[@rolename=]'role':當(dāng)前數(shù)據(jù)庫(kù)中的數(shù)據(jù)庫(kù)角色的名稱。[@membername=]'security_account':security_account

可以是數(shù)據(jù)庫(kù)用戶、數(shù)據(jù)庫(kù)角色、Windows登錄或Windows組。只有固定服務(wù)器角色sysadmin及db_owner的成員才能執(zhí)行該系統(tǒng)存儲(chǔ)過(guò)程。

第25頁(yè)(4)刪除數(shù)據(jù)庫(kù)角色成員語(yǔ)法:sp_droprolemember

[@rolename=]'role',[@membername=]'security_account'只有固定服務(wù)器角色sysadmin及db_owner的成員才能執(zhí)行該系統(tǒng)存儲(chǔ)過(guò)程。[例4.12]在數(shù)據(jù)庫(kù)角色r1中刪除用戶uu2。sp_droprolememberr1,uu2第26頁(yè)4.權(quán)限管理(1)管理語(yǔ)句權(quán)限的語(yǔ)法:GRANT/DENY{ALL|command_list}TO{PUBLIC|name_list}REVOKE{ALL|command_list}FROM{PUBLIC|name_list}其中:·command_list:是CREATEDATABASE、CREATEDEFAULT、CREATEFUNCTION、CREATEPROCEDURE、CREATERULE、CREATETABLE、CREATEVIEW、BACKUPDATABASE、BACKUPLOG?!UBLIC:表示所有的用戶?!LL:表示上述所有權(quán)限?!ame_list:用戶名稱,可以將某組權(quán)限同時(shí)授予多個(gè)用戶,用戶名之間用逗號(hào)分割。語(yǔ)義:將對(duì)指定操作對(duì)象的指定操作權(quán)限授予指定的用戶。第27頁(yè)(2)管理對(duì)象權(quán)限的語(yǔ)法:GRANT/DENY{ALL|command_list}ON<table_name>[<col_name>,…]TO{PUBLIC|name_list}[WITHGRANTOPTION]REVOKE{ALL|command_list}ON<table_name>[<col_name>,…]FROM{PUBLIC|name_list}第28頁(yè)其中:·command_list:包括UPDATE、SELECT、INSERT、DELETE、EXCUTE、ALL?!able_name:數(shù)據(jù)庫(kù)對(duì)象名?!UBLIC:表示所有的用戶?!LL:表示上述所有權(quán)限?!ITHGRANTOPTION:將指定的對(duì)象權(quán)限授予其它安全賬號(hào)的能力。注意:當(dāng)對(duì)列授予權(quán)限時(shí),命令項(xiàng)可以包括SELECT和UPDATE或兩者的組合,而在SELECT中若使用了SELECT*則必須對(duì)表的所有列賦予SELECT權(quán)限。第29頁(yè)[例4.13]分別創(chuàng)建登錄賬號(hào)u3,u4,u5,u6,其密碼皆為p888888,并設(shè)置為訂單數(shù)據(jù)庫(kù)的用戶。sp_addloginu3,p888888sp_addloginu4,p888888sp_addloginu5,p888888sp_addloginu6,p888888USEOrderDB//打開(kāi)訂單數(shù)據(jù)庫(kù)sp_adduseru3,u3sp_adduseru4,u4sp_adduseru5,u5sp_adduseru6,u6第30頁(yè)[例4.14]把查詢Customer表權(quán)限授給用uu2。GRANTSELECTONCustomerTOuu2[例4.15]給u3授予建表和建視圖的權(quán)限。GRANTCREATETABLE,CREATEVIEWTOu3[例4.16]把對(duì)Customer表和Employee表的全部權(quán)限授予用戶u3和u4,并具有轉(zhuǎn)授權(quán)限。GRANTALLprivilegesONCustomerTOu3,u4WITHGRANTOPTIONGRANTALLprivilegesONEmployeTOu3,u4WITHGRANTOPTION[例4.17]把用戶u4修改客戶編號(hào)的權(quán)限收回。REVOKEUPDATE(customerNo)ONCustomerFROMu4CASCADE第31頁(yè)[例4.18]通過(guò)角色來(lái)實(shí)現(xiàn)將一組權(quán)限授予一個(gè)用戶。步驟如下:①創(chuàng)建角色jw。sp_addrolejw②給角色jw授予Employee表的SELECT、UPDATE、INSERT權(quán)限。GRANTSELECT,UPDATE,INSERTONEmployeeTOjw③將這個(gè)角色授予用戶u5、u6。sp_addrolememberjw,u5sp_addrolememberjw,u6④收回u5的所有權(quán)限。sp_droprolememberjw,u5⑤修改角色jw權(quán)限,增加其刪除DELETE權(quán)限。GRANTDELETEONEmployeeTOjw第32頁(yè)5.安全性檢查[例4.19]用戶user04需要在訂單數(shù)據(jù)庫(kù)中創(chuàng)建一個(gè)視圖ProductView(查詢每種產(chǎn)品的訂購(gòu)數(shù)量、訂購(gòu)平均價(jià)),并將該視圖的查詢權(quán)限授予用戶user05和user06,請(qǐng)完成該操作。首先在master數(shù)據(jù)庫(kù)中創(chuàng)建這三個(gè)用戶,并設(shè)置為訂單數(shù)據(jù)庫(kù)的用戶。sp_addloginuser04,p888888sp_addloginuser05,p888888

sp_addloginuser06,p888888在OrderDB數(shù)據(jù)庫(kù)中加入這三個(gè)用戶。sp_adduseruser04,user04sp_adduseruser05,user05sp_adduseruser06,user06第33頁(yè)授予user04創(chuàng)建視圖的權(quán)限。grantcreateviewtouser04以u(píng)ser04用戶身份登錄,創(chuàng)建視圖。createviewProductViewasselectproductNo,sum(quantity)qty,avg(quantity*price)/sum(quantity)avgPricefromOrderDetailgroupbyproductNo將ProductView視圖的權(quán)限授予用戶user05和user06。grantselectonProductViewtouser05,user06第34頁(yè)[例4.20]用戶user05查詢視圖ProductView。首先以u(píng)ser05身份登錄,然后查詢ProductView視圖。select*fromProductView第35頁(yè)4.2.3實(shí)驗(yàn)內(nèi)容1、使用訂單數(shù)據(jù)庫(kù)OrderDB完成下面的實(shí)驗(yàn)內(nèi)容:(1)分別創(chuàng)建登錄賬號(hào)user01、user02,其密碼皆為p888888,并設(shè)置為訂單數(shù)據(jù)庫(kù)OrderDB的用戶。(2)創(chuàng)建登錄賬號(hào)login03,并加入到OrderDB數(shù)據(jù)庫(kù)中,其用戶名為user03。(3)將員工表的所有權(quán)限授予全部用戶。(4)授予user03用戶對(duì)Product表的查詢權(quán)限,對(duì)Employee表的編號(hào)、名稱的查詢和更新權(quán)限。(5)創(chuàng)建角色r3、r4,將訂單明細(xì)表所有列的SELECT權(quán)限、PRICE列的UPDATE權(quán)限授予r3。(6)收回全部用戶對(duì)員工表的所有權(quán)限。(7)將user01、user02兩個(gè)用戶賦予r3角色。(8)收回user02對(duì)訂單明細(xì)表所有列的SELECT權(quán)限。

(9)在當(dāng)前數(shù)據(jù)庫(kù)中刪除角色r4。(10)授予user01建表和建視圖的權(quán)限,user01用戶分別建立一張表和一個(gè)視圖(表和視圖自定),然后將該表和視圖的查詢權(quán)限授予user02和user03。第36頁(yè)2、使用訂單數(shù)據(jù)庫(kù)OrderDB完成下面的實(shí)驗(yàn),記錄詳細(xì)的操作過(guò)程:(1)用戶user07在訂單數(shù)據(jù)庫(kù)中創(chuàng)建一張表Table1(內(nèi)容自定)。(2)用戶user02對(duì)表Table1和表OrderDetail執(zhí)行了插入和查詢操作(內(nèi)容自定)。(3)用戶user03建立兩張表Table2和Table3和一個(gè)視圖View1(內(nèi)容自定),然后將該表和視圖的查詢權(quán)限授予user05和user06,并具有轉(zhuǎn)授權(quán)限。(4)在訂單數(shù)據(jù)庫(kù)中創(chuàng)建兩個(gè)角色r5和r6,角色r5具有創(chuàng)建表和視圖的權(quán)限,角色r6具有對(duì)Customer表的查詢、插入權(quán)限,Employee表的查詢、更新和插入權(quán)限,OrderMaster表的所有權(quán)限。(5)用戶user05將user03用戶創(chuàng)建的表和視圖的查詢權(quán)限授予了用戶user07,user07用戶對(duì)表Table2進(jìn)行了插入操作。(6)user07用戶具有角色r5,同時(shí)創(chuàng)建了表Table4(內(nèi)容自定)。第37頁(yè)4.3實(shí)驗(yàn)十一

完整性定義與檢查4.3.1實(shí)驗(yàn)?zāi)康呐c要求充分理解關(guān)系數(shù)據(jù)庫(kù)中關(guān)于數(shù)據(jù)庫(kù)完整性的概念。掌握實(shí)體完整性的定義方法。掌握參照完整性定義的方法。掌握用戶自定義完整性的方法。充分理解關(guān)系數(shù)據(jù)庫(kù)中關(guān)于數(shù)據(jù)庫(kù)完整性的概念。掌握實(shí)體完整性檢查方法。掌握參照完整性檢查方法。掌握用戶自定義完整性檢查方法。第38頁(yè)4.3.2實(shí)驗(yàn)案例創(chuàng)建表及完整性約束的語(yǔ)法:CREATETABLEtable_name(column_name1datetype[DEFAULTdefault_value][NULL/NOTNULL][CHECKsearch_condition],column_name2datetype......

∶[CONSTRAINTconstrain_name1{UNIQUE/PRIMARYKEY}(colum_name[,colum_name…][ONgroupfile_name])],[CONSTRAINTconstrain_name2FOREIGNKEY(column_name1),[column_name2,…]REFERENCESref_table(ref_column1[,ref_column2,…])],...)ONgroupfile_name)第39頁(yè)1.實(shí)體完整性約束實(shí)體完整性通過(guò)設(shè)置主鍵PRIMARYKEY來(lái)實(shí)現(xiàn),當(dāng)表的主鍵只有一列時(shí),可以在創(chuàng)建表時(shí)直接在列后指定PRIMARYKEY,也可以由CONSTRAINT關(guān)鍵字來(lái)指定;

當(dāng)表的主鍵多于一列時(shí),必須使用元組級(jí)的定義來(lái)指定PRIMARYKEY。[例4.21]創(chuàng)建一個(gè)客戶表,并為該表建立主鍵約束。CREATETABLECustomer(customerNochar(9),/*客戶編號(hào)*/CONSTRAINTCustomerPKPRIMARYKEY(customerNo),customerNamevarchar(40),/*客戶名稱*/telephonevarchar(20),/*客戶電話*/addresschar(40),/*客戶住址*/zipchar(6)/*郵政編碼*/)本例中,主鍵由CONSTRAINT定義并命名為CustomerPK。第40頁(yè)由于該表只有一列作為主鍵,所以還可以用下面的方法來(lái)定義,但約束名由系統(tǒng)自動(dòng)定義。CREATETABLECustomer(customerNochar(9)PRIMARYKEY,/*客戶編號(hào)*/customerNamevarchar(40),/*客戶名稱*/telephonevarchar(20),/*客戶電話*/addresschar(40),/*客戶住址*/zipchar(6)/*郵政編碼*/)第41頁(yè)[例4.22]創(chuàng)建一訂單明細(xì)表,為該表建立主鍵約束。CREATETABLEOrderDetail(orderNochar(12),/*訂單編號(hào)*/productNochar(9),/*產(chǎn)品編號(hào)*/quantityint,/*銷售數(shù)量*/pricenumeric(7,2),/*訂貨單價(jià)*/

CONSTRAINTorderdetailpkPRIMARYKEY(orderNo,productNo))本例中,主鍵有兩列構(gòu)成,所以必須定義為元組級(jí)的約束,本例由CONSTRAINT來(lái)定義主鍵,并為該約束命名為OrderDetailPK。第42頁(yè)2.參照完整性約束參照完整性指有些表的列(或列的組合)和其他表的主鍵相關(guān)聯(lián),用戶可以給這個(gè)列(或列的組合)定義為FOREIGNKEY,并以REFERENCES關(guān)鍵字設(shè)置它所關(guān)聯(lián)的表及其列組。[例4.24]建立一張訂單主表,要求給該表建立主鍵約束和關(guān)于員工表和客戶表的外鍵約束。CREATETABLEOrderMaster(orderNochar(12)PRIMARYKEY,/*訂單編號(hào)*/customerNochar(9),/*客戶號(hào)*/salerNochar(8),/*業(yè)務(wù)員編號(hào)*/orderDatedatetime,/*訂貨日期*/orderSumnumeric(9,2),/*訂單金額*/invoiceNochar(10),/*發(fā)票號(hào)碼*/

CONSTRAINTOrdermasterFK1FOREIGNKEY(customerNo)REFERENCESCustomer(customerNo))本例中,外鍵由CONSTRAINT來(lái)定義,并為該約束命名為OrdermasterFK1。第43頁(yè)3.用戶自定義完整性約束在建表時(shí),用戶可以根據(jù)應(yīng)用的要求,定義屬性上的約束條件,即屬性限制,包括:列值非空(NOTNULL)、列值唯一(UNIQUE)、檢查是否滿足一個(gè)布爾表達(dá)式(CHECK短語(yǔ))、默認(rèn)值設(shè)置(DEFAULT)等。[例4.26]創(chuàng)建一個(gè)客戶表,為該表建立客戶編號(hào)約束:編號(hào)共9位,第1位為C。CREATETABLECustomer(customerNochar(9)NOTNULLPRIMARYKEY,/*客戶編號(hào)*/

CHECK(CustomerNoLIKE'[C][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'),customerNamevarchar(40)NOTNULL,/*客戶名稱*/telephonevarchar(20)NOTNULL,/*客戶電話*/addresschar(40)NOTNULL,/*客戶住址*/zipchar(6)NULL/*郵政編碼*/)第44頁(yè)[例4.27]建立一張員工表,要求給該表建立各項(xiàng)約束,包括:主鍵約束;性別是‘m’或‘f’;薪水在3000~8000。CREATETABLEEmployee(employeeNochar(8)NOTNULL/*員工編號(hào)*/CHECK(EmployeeNoLIKE'[E][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'),employeeNamevarchar(10)NOTNULL,/*員工姓名*/sexchar(1)NOTNULL,/*員工性別*/

CONSTRAINTemp_sexchkCHECK(sexIN('m','f')),birthdaydatetimeNULL,/*員工生日*/addressvarchar(50)NULL,/*員工住址*/telephonevarchar(20)NULL,/*員工電話*/hireDatedatetimeNOTNULL,/*雇傭日期*/departmentvarchar(30)NOTNULL,/*所屬部門*/titlevarchar(6)NOTNULL,/*職稱*/salarynumeric(8,2)NOTNULL,/*薪水*/

CONSTRAINTEmployeePKPRIMARYKEY(employeeNo),CONSTRAINTemp_salarychkCHECK(salaryBETWEEN3000AND8000))第45頁(yè)[例4.28]建立一張訂單主表,要求發(fā)票號(hào)碼唯一。CREATETABLEOrderMaster(orderNochar(12)NOTNULLPRIMARYKEY,/*訂單編號(hào)*/customerNochar(9)NOTNULL,/*客戶編號(hào)*/salerNochar(8)NOTNULL,/*業(yè)務(wù)員編號(hào)*/orderDatedatetimeNOTNULL,/*訂貨日期*/orderSumnumeric(9,2),/*訂單金額*/invoiceNochar(10)NOTNULLUNIQUE,/*發(fā)票號(hào)碼*/

CONSTRAINTOrdermasterfk1FOREIGNKEY(customerNo)REFERENCESCustomer(customerNo),CONSTRAINTOrdermasterfk2FOREIGNKEY(salerNo)REFERENCESEmployee(employeeNo))第46頁(yè)4.修改約束使用ALTERTABLE語(yǔ)句修改表中的完整性約束。要修改約束,首先必須刪除約束,然后將新的約束加入:刪除約束:ALTERTABLEtable_nameDROPCONSTRAINTconstraint_name添加約束:ALTERTABLEtable_nameADDCONSTRAINTconstraint_name<CHECK|UNIQUE|PRIMARYKEY|FOREIGNKEY>(<constraintExpr>)其中,<tableName>為欲修改約束所在的表名;<constraintName>為欲修改的約束名稱。第47頁(yè)5.完整性約束檢查(1)當(dāng)插入或?qū)χ鞔a列進(jìn)行更新操作時(shí),關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng)按照實(shí)體完整性規(guī)則自動(dòng)進(jìn)行檢查,如果違反了,則進(jìn)行違約處理。(2)當(dāng)對(duì)參照表和被參照表進(jìn)行更新操作時(shí),關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng)按照參照完整性規(guī)則自動(dòng)進(jìn)行檢查,如果違反了,則進(jìn)行相應(yīng)的違約處理。(3)當(dāng)對(duì)關(guān)系表中創(chuàng)建了用戶自定義完整性涉及的列進(jìn)行更新操作時(shí),關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng)按照用戶自定義完整性規(guī)則自動(dòng)進(jìn)行檢查,如果違反了,則進(jìn)行相應(yīng)的違約處理。

第48頁(yè)(1)實(shí)體完整性檢查[例4.29]對(duì)客戶表插入一個(gè)元組('C20200001','南華股份有限公司',,'南昌市','380001')。插入代碼如下:insertCustomervalues('C20200001','南華股份有限公司',,'南昌市','380001')本例中,插入命令提交后,DBMS自動(dòng)進(jìn)行實(shí)體完整性檢查。由于插入的元組中客戶編號(hào)’C20200001’違反了PRIMARYKEY約束,不能在對(duì)象Customer中插入

溫馨提示

  • 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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 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)論