關(guān)系數(shù)據(jù)庫(kù)設(shè)計(jì)與應(yīng)用(工作手冊(cè)式) 課件 第7章 SQL的高級(jí)功能_第1頁(yè)
關(guān)系數(shù)據(jù)庫(kù)設(shè)計(jì)與應(yīng)用(工作手冊(cè)式) 課件 第7章 SQL的高級(jí)功能_第2頁(yè)
關(guān)系數(shù)據(jù)庫(kù)設(shè)計(jì)與應(yīng)用(工作手冊(cè)式) 課件 第7章 SQL的高級(jí)功能_第3頁(yè)
關(guān)系數(shù)據(jù)庫(kù)設(shè)計(jì)與應(yīng)用(工作手冊(cè)式) 課件 第7章 SQL的高級(jí)功能_第4頁(yè)
關(guān)系數(shù)據(jù)庫(kù)設(shè)計(jì)與應(yīng)用(工作手冊(cè)式) 課件 第7章 SQL的高級(jí)功能_第5頁(yè)
已閱讀5頁(yè),還剩124頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第7章

SQL的高級(jí)功能工業(yè)和信息化部“十四五”規(guī)劃教材

浙江省高職院?!笆奈濉笔着攸c(diǎn)教材《關(guān)系數(shù)據(jù)庫(kù)設(shè)計(jì)與應(yīng)用》(工作手冊(cè)式)

配套課件學(xué)習(xí)目標(biāo)LEARNINGTARGET掌握視圖的概念、創(chuàng)建、查詢(xún)與管理;理解約束的類(lèi)別和重要性;理解SQL的安全控制策略;理解事務(wù)與鎖的概念。知識(shí)目標(biāo)能力目標(biāo)會(huì)進(jìn)行視圖的創(chuàng)建、查詢(xún)、刪除操作;會(huì)創(chuàng)建與調(diào)用存儲(chǔ)過(guò)程及設(shè)計(jì)觸發(fā)器。思政目標(biāo)樹(shù)立遵紀(jì)守法意識(shí);樹(shù)立數(shù)據(jù)安全意識(shí);培養(yǎng)自主學(xué)習(xí)能力。主要內(nèi)容MAINCONTENTS7.1視圖7.2約束7.3存儲(chǔ)過(guò)程

*7.4觸發(fā)器

*7.5安全控制7.6事務(wù)和鎖視

圖7.1視圖7.1.1視圖的概念在SQL術(shù)語(yǔ)中,視圖是一種類(lèi)表對(duì)象?;蚍Q(chēng)之為衍生表(虛擬表),它并不在物理上包含數(shù)據(jù),但是它的定義是永久性的?;颈硎菍?shí)際存在于數(shù)據(jù)庫(kù)中的,但視圖卻并不真正存在。視圖是存儲(chǔ)在數(shù)據(jù)庫(kù)中的預(yù)先定義好的查詢(xún),具有基本表的外觀(guān),可以像基本表一樣對(duì)其進(jìn)行存取,但不占據(jù)物理存儲(chǔ)空間,視圖也稱(chēng)為窗口。視圖是從一個(gè)或多個(gè)已經(jīng)存在的基本表邏輯地衍生出的,可以認(rèn)為是以另一種方式觀(guān)察現(xiàn)有數(shù)據(jù)。這樣,基本表中的數(shù)據(jù)如果發(fā)生變化,視圖中查詢(xún)出的數(shù)據(jù)也隨之變化。視圖視圖與基本表的主要區(qū)別:基本表中的數(shù)據(jù)要消耗物理空間來(lái)存儲(chǔ),而視圖并不需要物理存儲(chǔ)空間,因?yàn)槭聦?shí)上視圖中的數(shù)據(jù)是通過(guò)參照基本表而得到的。在數(shù)據(jù)庫(kù)中,視圖具有和基本表一樣的使用方法,即可以像從基本表中查詢(xún)數(shù)據(jù)那樣從視圖中查詢(xún)數(shù)據(jù),也可以對(duì)視圖中的數(shù)據(jù)進(jìn)行操作,盡管會(huì)有一些限制。7.1.1視圖的概念視圖視圖的優(yōu)點(diǎn):(1)簡(jiǎn)化用戶(hù)的操作,使用戶(hù)將注意力集中在視圖所關(guān)聯(lián)的數(shù)據(jù)上;(2)使用戶(hù)能以多種角度看待同一數(shù)據(jù),這種靈活性可以使不同的用戶(hù)以不同的方式看待同一數(shù)據(jù);(3)能夠?qū)C(jī)密數(shù)據(jù)提供安全保護(hù)。在設(shè)計(jì)數(shù)據(jù)庫(kù)應(yīng)用系統(tǒng)時(shí),對(duì)不同的用戶(hù)定義不同的視圖,使機(jī)密數(shù)據(jù)不出現(xiàn)在不應(yīng)看到這些數(shù)據(jù)的用戶(hù)視圖上,自動(dòng)提供了對(duì)機(jī)密數(shù)據(jù)的安全保護(hù)功能;(4)為數(shù)據(jù)庫(kù)重構(gòu)提供一定的邏輯獨(dú)立性。如果只是通過(guò)視圖來(lái)存取數(shù)據(jù)庫(kù)中的數(shù)據(jù),DBA可以有選擇地改變構(gòu)成視圖的基本表,而不用考慮那些通過(guò)視圖引用數(shù)據(jù)的應(yīng)用程序的改動(dòng)。7.1.1視圖的概念視圖7.1.2視圖的定義視圖是根據(jù)對(duì)基本表的查詢(xún)定義的。定義視圖實(shí)際上就是數(shù)據(jù)庫(kù)執(zhí)行定義該視圖的查詢(xún)語(yǔ)句。視圖可以建立在基本表上,也可以建立在其它的視圖上,即可以在一個(gè)視圖之上再定義視圖。定義視圖的SQL語(yǔ)句為CREATEVIEW,其基本格式為:CREATEVIEW<視圖名>[(視圖列名表)]AS子查詢(xún)語(yǔ)句視圖7.1.2視圖的定義【例7.1】創(chuàng)建GZ02計(jì)5班男同學(xué)的視圖。CREATEVIEWXS_MASSELECT學(xué)號(hào),姓名,年齡FROM學(xué)生表WHERE班級(jí)='GZ02計(jì)5'AND性別='M'注意:DBMS執(zhí)行CREATEVIEW語(yǔ)句只是保存視圖的定義,并不執(zhí)行其中的SELECT語(yǔ)句,只有在對(duì)視圖的執(zhí)行查詢(xún)時(shí),才按視圖的定義從相應(yīng)的基本表中查詢(xún)數(shù)據(jù)。視圖7.1.2視圖的定義【例7.2】如果需要?jiǎng)?chuàng)建GZ02計(jì)5班中選修了1號(hào)課程的學(xué)生的視圖。CREATEVIEWXS_1(學(xué)號(hào),姓名,成績(jī))ASSELECT學(xué)生表.學(xué)號(hào),姓名,成績(jī)FROM學(xué)生表,選課表WHERE學(xué)生表.學(xué)號(hào)=選課表.學(xué)號(hào)AND班級(jí)='GZ02計(jì)5'AND課程號(hào)=1視圖7.1.2視圖的定義【例7.3】如果需要將每個(gè)學(xué)生的學(xué)號(hào)及平均成績(jī)存放在一個(gè)名為S_G的視圖中。CREATEVIEWS_G(學(xué)號(hào),平均成績(jī))ASSELECT學(xué)號(hào),AVG(成績(jī))FROM選課表GROUPBY學(xué)號(hào)注意:以上建立視圖的語(yǔ)句含有GROUPBY子句,視圖中包含了分組統(tǒng)計(jì)信息,這樣的視圖只能用于查詢(xún),不能用于修改數(shù)據(jù)。視圖7.1.3視圖查詢(xún)視圖定義之后,就可以對(duì)視圖進(jìn)行查詢(xún)了。對(duì)視圖的查詢(xún)與對(duì)基本表的查詢(xún)非常類(lèi)似,只是查詢(xún)的對(duì)象不同而已。SELECT*FROMS_G注意:視圖查詢(xún)實(shí)際上是對(duì)基本表的查詢(xún),其查詢(xún)結(jié)果是從基本表得到的,所以,同樣一個(gè)視圖查詢(xún),在不同的的執(zhí)行時(shí)間可能得到不同的結(jié)果,因?yàn)樵谶@段時(shí)間里,基本表可能發(fā)生變化。【例7.4】如果需要查詢(xún)S_G視圖的信息。視圖7.1.4修改查詢(xún)既然視圖是一個(gè)類(lèi)表對(duì)象,我們也可以對(duì)視圖中的數(shù)據(jù)進(jìn)行添加、修改、刪除(INSERT、UPDATE、DELETE)。但是因?yàn)橐晥D本身不包含數(shù)據(jù),所以對(duì)于這些操作有很多限制:(1)修改(INSERT、UPDATE)視圖中數(shù)據(jù)時(shí),不能同時(shí)修改多于一個(gè)的基表。也就是說(shuō)修改只能作用于一個(gè)基表。(2)不能修改通過(guò)計(jì)算而得到的列(在視圖定義的選擇列表中沒(méi)有使用表達(dá)式、聚合函數(shù)或GROUPBY、UNION、DISTINCT或TOP子句)。(3)如果在創(chuàng)建視圖時(shí)制定了WITHCHECKOPTION選項(xiàng),那么要保證修改后的數(shù)據(jù)符合視圖定義。(4)執(zhí)行UPDATE、DELETE時(shí),所作用的行必須包含在視圖的結(jié)果集中。(5)如果視圖引用多個(gè)表則不允許執(zhí)行DELETE。注意:視圖中的數(shù)據(jù)實(shí)際上是不存在的。對(duì)視圖中的數(shù)據(jù)的任意修改都必須傳遞到視圖的基本表中。視圖7.1.5刪除查詢(xún)與基本表一樣,視圖也可以根據(jù)需要隨時(shí)刪除,刪除視圖的SQL語(yǔ)句的格式為:注意:如果被刪除的視圖是其它視圖的數(shù)據(jù)源,那么刪除了作為數(shù)據(jù)源的視圖之后,導(dǎo)出視圖也就無(wú)法再使用了。同樣的道理,如果視圖的基本表被刪除了,則視圖也將無(wú)法使用。因此,在刪除基本表和視圖時(shí)一定要注意是否有引用被刪除對(duì)象的視圖,如果有則應(yīng)同時(shí)刪除?!纠?.5】要求刪除前面定義的視圖S_G。DROPVIEW<視圖名>DROPVIEWS_G視圖7.1.6利用視圖管理數(shù)據(jù)在創(chuàng)建視圖之后,可以通過(guò)視圖來(lái)對(duì)基表的數(shù)據(jù)進(jìn)行管理。但是無(wú)論在什么時(shí)候?qū)σ晥D的數(shù)據(jù)進(jìn)行管理,實(shí)際上都是在對(duì)視圖對(duì)應(yīng)數(shù)據(jù)表中的數(shù)據(jù)進(jìn)行管理。1.利用視圖查詢(xún)數(shù)據(jù)SELECT*FROMS_GWHERE學(xué)號(hào)='2021529'利用視圖查詢(xún)數(shù)據(jù),類(lèi)似于將視圖看作一個(gè)基本表,進(jìn)行查詢(xún)數(shù)據(jù)的功能?!纠?.6】直接調(diào)用【例7.3】中S_G的視圖,查詢(xún)學(xué)號(hào)為2021529的學(xué)生信息視圖7.1.6利用視圖管理數(shù)據(jù)2.利用視圖插入數(shù)據(jù)INSERTINTOXS_MVALUES('2021001','張三','20')可以利用INSERT語(yǔ)句通過(guò)視圖向基本表插入數(shù)據(jù)。但要特別注意的是,由于視圖不一定包括表種的所有字段,所以在插入記錄時(shí)可能會(huì)遇到問(wèn)題。視圖中那些沒(méi)有出現(xiàn)的字段是無(wú)法顯式插入數(shù)據(jù),假如這些字段不接受系統(tǒng)指派的NULL值,那么插入操作將失敗?!纠?.7】向【例7.1】中的視圖XS_M插入一個(gè)新的學(xué)生記錄,學(xué)號(hào)為2021001。視圖7.1.6利用視圖管理數(shù)據(jù)2.利用視圖插入數(shù)據(jù)注意:如果插入的數(shù)據(jù)不滿(mǎn)足條件,則會(huì)報(bào)錯(cuò)。如下4種情況要特別注意。(1)對(duì)于UPDATE,有WITHCHECKOPTION,要保證UPDATE后,數(shù)據(jù)能被視圖查詢(xún)出來(lái);(2)對(duì)于DELETE,有無(wú)WITHCHECKOPTION都一樣;(3)對(duì)于INSERT,有WITHCHECKOPTION,要保證INSERT后,數(shù)據(jù)能被視圖查詢(xún)出來(lái);(4)對(duì)于沒(méi)有WHERE子句的視圖,使用WITHCHECKOPTION是多余的。視圖7.1.6利用視圖管理數(shù)據(jù)3.利用視圖更新數(shù)據(jù)可以利用UPDATE語(yǔ)句通過(guò)視圖更新基本表的數(shù)據(jù)?!纠?.8】將視圖XS_M學(xué)號(hào)為2021519的學(xué)生姓名改為“趙武”。UPDATEXS_MSET姓名='趙武'WHERE學(xué)號(hào)='2021519'UPDATE學(xué)生表SET姓名='趙武'WHERE學(xué)號(hào)='2021519'視圖7.1.6利用視圖管理數(shù)據(jù)4.利用視圖刪除數(shù)據(jù)可以利用DELETE語(yǔ)句通過(guò)視圖刪除基本表的數(shù)據(jù)。但對(duì)于依賴(lài)多個(gè)基本表的視圖,不能使用DELETE語(yǔ)句?!纠?.9】刪除視圖XS_M種學(xué)號(hào)為2021519的學(xué)生記錄。DELETEFROMXS_MWHERE學(xué)號(hào)='2021519'DELETEFROM學(xué)生表WHERE學(xué)號(hào)='2021519'視圖1.創(chuàng)建視圖view_avg,視圖內(nèi)容為GZ02計(jì)5班每個(gè)學(xué)生的平均成績(jī),并按照從高到低排序。2.查詢(xún)視圖view_avg中學(xué)生學(xué)號(hào)、姓名、課程名和成績(jī)等信息。3.刪除視圖view_avg。課堂練習(xí)1:約

束7.2約束7.2.1主鍵約束7.2.2外鍵約束7.2.3默認(rèn)值約束7.2.4唯一約束7.2.5檢查約束7.2.6非空約束7.2.7約束的作用對(duì)象約束7.2.1主鍵約束(PRIMARYKEYCONSTRAINT)表中經(jīng)常有一列或多列的組合,其值能唯一地標(biāo)識(shí)表中的每一行。這樣的一列或多列稱(chēng)為表的主鍵(也稱(chēng)為主碼)。主鍵約束(PRIMARYKEYCONSTRAINT)用于標(biāo)識(shí)這些列或列集,這些列或列集的值能唯一地標(biāo)識(shí)表中的行,即主鍵約束可以定義。使用主鍵約束應(yīng)注意以下內(nèi)容。一個(gè)表只能有一個(gè)PRIMARYKEY約束。PRIMARYKEY約束中的列不能有重復(fù)值,也不能接受空值。一般地,主鍵約束在CREATETABLE語(yǔ)句中定義(當(dāng)然也可在ALTERTABLE語(yǔ)句中定義)。主鍵約束可以有以下兩種不同的定義方式。如果只有一列作為主鍵,那么可以在定義表時(shí)列出屬性,并說(shuō)明某個(gè)屬性是主鍵。如果是一列或多列構(gòu)成主鍵,那么可以在表定義中加入額外的說(shuō)明,即說(shuō)明某列或列集構(gòu)成主鍵。約束7.2.1主鍵約束(PRIMARYKEYCONSTRAINT)【例7.10】在學(xué)生表中指定學(xué)號(hào)字段為主鍵,可用兩種方式定義主鍵約束語(yǔ)句。CREATETABLE學(xué)生表(學(xué)號(hào)INTPRIMARYKEY,姓名CHAR(8),性別CHAR(1),班級(jí)CHAR(10),年齡INT)CREATETABLE學(xué)生表(學(xué)號(hào)INT,姓名CHAR(8),性別CHAR(1),班級(jí)CHAR(10),年齡INT,PRIMARYKEY(學(xué)號(hào)))約束7.2.1主鍵約束(PRIMARYKEYCONSTRAINT)在ALTERTABLE語(yǔ)句中添加主鍵約束的語(yǔ)法格式如下。ALTERTABLE<表名>ADDCONSTRAINT<約束名>PRIMARYKEY(<列名>[,...n])約束7.2.1主鍵約束(PRIMARYKEYCONSTRAINT)【例7.11】在課程表的“課程號(hào)”字段上增加一個(gè)主鍵約束,此約束的名稱(chēng)為“PK_課程表”,可使用添加單列的主鍵約束語(yǔ)句。ALTERTABLE課程表ADDCONSTRAINTPK_課程表PRIMARYKEY(課程號(hào))【例7.12】將選課表的“學(xué)號(hào)”字段和“課程號(hào)”字段共同構(gòu)成主鍵,此約束的名稱(chēng)為“PK_選課表”,可使用添加列集的主鍵約束語(yǔ)句。ALTERTABLE選課表ADDCONSTRAINTPK_選課表PRIMARYKEY(學(xué)號(hào),課程號(hào))約束7.2.2外鍵約束(FOREIGNKEYCONSTRAINT)外鍵(FOREIGN

KEY)約束就是存儲(chǔ)實(shí)體之間聯(lián)系信息的方式,也是數(shù)據(jù)庫(kù)中非常重要的一種約束。外鍵是用于建立和加強(qiáng)兩個(gè)表數(shù)據(jù)之間鏈接的一列或多列。通過(guò)將表中主鍵值的一列或多列添加到另一個(gè)表中,可以創(chuàng)建兩個(gè)表之間的鏈接,該列就成為第二個(gè)表的外鍵。約束7.2.2外鍵約束(FOREIGNKEYCONSTRAINT)1.定義外鍵約束外鍵約束實(shí)現(xiàn)了引用完整性。在添加外鍵時(shí)應(yīng)注意,外鍵所引用的列必須是有主鍵約束或唯一約束的列。FOREIGNKEY可以引用同一表中的其他列(自引用)。約束7.2.2外鍵約束(FOREIGNKEYCONSTRAINT)1.定義外鍵約束【例7.13】在選課表的“學(xué)號(hào)”字段上建立與學(xué)生表的“學(xué)號(hào)”字段的外鍵約束,并且在選課表的“課程號(hào)”字段上建立與課程表的“課程號(hào)”字段的外鍵約束。CREATETABLE選課表(學(xué)號(hào)INTNOTNULL,課程號(hào)INTNOTNULL,成績(jī)FLOAT,PRIMARYKEY(學(xué)號(hào),課程號(hào)),FOREIGNKEY(學(xué)號(hào))REFERENCES學(xué)生表(學(xué)號(hào)),FOREIGNKEY(課程號(hào))REFERENCES課程表(課程號(hào)))注意:在定義外鍵時(shí),外鍵列與引用列的列名可以不同。約束7.2.2外鍵約束(FOREIGNKEYCONSTRAINT)1.定義外鍵約束添加外鍵約束的語(yǔ)法格式如下。ALTERTABLE<表名>ADDCONSTRAINT<約束名>FOREIGNKEY(<列名>)REFERENCES引用表名(<列名>)約束7.2.2外鍵約束(FOREIGNKEYCONSTRAINT)1.定義外鍵約束【例7.14】在選課表的“學(xué)號(hào)”字段上建立一個(gè)外鍵約束,此約束的名稱(chēng)為“FK_學(xué)號(hào)”,引用的是學(xué)生表的“學(xué)號(hào)”字段。ALTERTABLE選課表ADDCONSTRAINTFK_學(xué)號(hào)FOREIGNKEY(學(xué)號(hào))REFERENCES學(xué)生表(學(xué)號(hào))約束7.2.2外鍵約束(FOREIGNKEYCONSTRAINT)2.引用行為盡管外鍵約束的主要目的是控制存儲(chǔ)在外鍵表中的數(shù)據(jù),但它還可以控制主鍵表中數(shù)據(jù)的修改。如果試圖刪除主鍵表中的行或更改主鍵值,而該主鍵值與另一個(gè)表的外鍵約束值相關(guān),則該操作有以下4種不同的引用行為(在SQLServer中)。第一種是NO

ACTION。ONUPDATENO

ACTION。ONDELETENO

ACTION。此時(shí),該操作不可實(shí)現(xiàn),產(chǎn)生錯(cuò)誤并回滾。NOACTION是默認(rèn)行為。約束7.2.2外鍵約束(FOREIGNKEYCONSTRAINT)2.引用行為第二種是CASCADE。ONUPDATECASCADE。ONDELETECASCADE。ALTERTABLE選課表ADDCONSTRAINTFK_學(xué)號(hào)FOREIGNKEY(學(xué)號(hào))REFERENCES學(xué)生表(學(xué)號(hào))ONUPDATECASCADEONDELETECASCADE如果要在學(xué)生表中刪除或更改某個(gè)學(xué)生的學(xué)號(hào),而該學(xué)號(hào)又恰好在選課表中有選課記錄,那么,在刪除或更改主鍵表(學(xué)生表)的主鍵值時(shí),與該外鍵約束相關(guān)的外鍵表(選課表)中的記錄也同時(shí)被刪除或更改。這種引用行為被稱(chēng)為“級(jí)聯(lián)”。約束7.2.2外鍵約束(FOREIGNKEYCONSTRAINT)2.引用行為第三種是SETNULL。ONUPDATESETNULL。ONDELETESETNULL。如果試圖刪除或更新某行,而該行的鍵被其他表的現(xiàn)有行中的外鍵所引用,則組成被引用行中的外鍵的所有值都將被設(shè)置為NULL。但只有目標(biāo)表的所有外鍵列可為空值,此約束才可執(zhí)行。約束7.2.2外鍵約束(FOREIGNKEYCONSTRAINT)2.引用行為第四種是SET

DEFAULT。ONUPDATESETDEFAULT。ONDELETESETDEFAULT。如果試圖刪除或更新某行,而該行的鍵被其他表的現(xiàn)有行中的外鍵所引用,則組成被引用行中的外鍵的所有值都將被設(shè)置為它們的默認(rèn)值。目標(biāo)表的所有外鍵列必須具有默認(rèn)值定義,此約束才可執(zhí)行。約束7.2.3默認(rèn)值約束(DEFAULTCONSTRAINT)默認(rèn)值(DEFAULT)約束指定了列的默認(rèn)值。也就是說(shuō),如果在某個(gè)基本表上的某列定義了默認(rèn)值約束,那么在新增一行時(shí),若不給該列分配值,則系統(tǒng)會(huì)自動(dòng)把該默認(rèn)值提供給該列,其格式如下。DEFAULT常量【例7.15】在前面定義的學(xué)生表中,如果為性別列指定一個(gè)默認(rèn)值“M”,則學(xué)生表的定義語(yǔ)句如下。CREATETABLE學(xué)生表(學(xué)號(hào)INT,姓名CHAR(8),性別CHAR(1)DEFAULT'M',班級(jí)CHAR(10),年齡INT)約束7.2.3默認(rèn)值約束(DEFAULTCONSTRAINT)如果要向已經(jīng)建好的表中添加默認(rèn)約束,其語(yǔ)法格式如下。ALTERTABLE<表名>ADD[CONSTRAINT]<約束名>DEFAULT默認(rèn)值FOR列名【例7.16】將學(xué)生表中年齡的默認(rèn)值定義為20,可為此添加DEFAULT約束。ALTERTABLE學(xué)生表ADDCONSTRAINTDF_AGEDEFAULT20FOR年齡注意:只有在向表中插入數(shù)據(jù)時(shí),系統(tǒng)才檢查DEFAULT約束。約束7.2.4唯一約束(UNIQUECONSTRAINT)使用唯一(UNIQUE)約束可以確保在非主鍵列中不輸入重復(fù)值。唯一約束在列集內(nèi)強(qiáng)制執(zhí)行值的唯一性。對(duì)于唯一約束中的列,表中不允許存在非空值相同的兩行。ALTERTABLE<表名>ADDCONSTRAINT<約束名>UNIQUE((<列名>[,...n])UNIQUE約束與主鍵約束的定義類(lèi)似,但應(yīng)注意區(qū)別兩者的不同,一個(gè)表只能有一個(gè)主鍵約束,而且主鍵約束中的列不允許為空值。因此在一個(gè)已有主鍵的表中使用UNIQUE約束是很有用的。在定義UNIQUE約束時(shí)應(yīng)注意以下內(nèi)容。(1)在一個(gè)表中可以定義多個(gè)UNIQUE約束,并允許在含空值的列上定義UNIQUE約束。(2)可以在一列或多列上定義UNIQUE約束。添加唯一約束的語(yǔ)法格式如下。約束7.2.4唯一約束(UNIQUECONSTRAINT)【例7.17】在課程表的備注字段上建立一個(gè)UNIQUE約束,此約束的名稱(chēng)為“UK_備注_課程表”。ALTERTABLE課程表ADDCONSTRAINTUK_備注_課程表UNIQUE(備注)約束7.2.5檢查約束(CHECKCONSTRAINT)在表中的某列上定義了一個(gè)CHECK約束之后,所有的元組插入都需要檢查是否滿(mǎn)足這種CHECK約束的要求。只有滿(mǎn)足這種要求的數(shù)據(jù)才能執(zhí)行成功,否則被系統(tǒng)拒絕執(zhí)行。在使用檢查約束時(shí)應(yīng)注意以下內(nèi)容。(1)系統(tǒng)在執(zhí)行INSERT語(yǔ)句或UPDATE語(yǔ)句時(shí)自動(dòng)檢查CHECK約束。(2)可以為每列指定多個(gè)CHECK約束。(3)CHECK約束可以約束同一個(gè)表中多列之間的取值關(guān)系。(4)可以通過(guò)任何基于邏輯運(yùn)算符返回結(jié)果True或False的邏輯(布爾)表達(dá)式來(lái)創(chuàng)建CHECK約束。(5)條件取值必須為布爾表達(dá)式,并且不能引用其他表。檢查(CHECK)約束對(duì)可以放入列中的值進(jìn)行限制,以強(qiáng)制執(zhí)行域的完整性。也就是說(shuō),CHECK約束用于將列的取值限制在指定的范圍內(nèi),從而使數(shù)據(jù)庫(kù)中存放的數(shù)據(jù)都是有意義的值。如人的性別只能是“男”或“女”,工資必須大于0元等。約束7.2.5檢查約束(CHECKCONSTRAINT)【例7.18】在學(xué)生表中定義一個(gè)約束,該約束保證所插入的學(xué)生性別要么是“M”,要么是“F”,而不能是其他數(shù)據(jù),在CREATETABLE語(yǔ)句中定義CHECK約束。CREATETABLE學(xué)生表(學(xué)號(hào)INTPRIMARYKEY,姓名CHAR(8),性別CHAR(1)CHECK(性別='M'OR性別='F'),班級(jí)CHAR(10),年齡INT)約束7.2.5檢查約束(CHECKCONSTRAINT)同樣,CHECK約束的定義不僅可以在列名稱(chēng)后面指定,還可以在表的定義中單獨(dú)指定,就像定義主鍵和外鍵一樣。在單獨(dú)定義CHECK約束時(shí),不僅可以指定一列的取值范圍,而且可以指定若干列共同的取值范圍。也就是說(shuō),CHECK約束可以限制整個(gè)元組的各個(gè)方面。CREATETABLE工資表(職工號(hào)CHAR(4)PRIMARYKEY,最低工資INT,最高工資INT,CHECK(最低工資<=最高工資))【例7.19】在工資表中建立最低工資必須小于或等于最高工資的CHECK約束,可使用CHECK約束限制多列的取值關(guān)系。約束7.2.5檢查約束(CHECKCONSTRAINT)添加CHECK約束的語(yǔ)法格式如下。ALTERTABLE選課表ADDCONSTRAINTCHK_成績(jī)CHECK(成績(jī)>=0AND成績(jī)<=100)【例7.20】在選課表中添加成績(jī)必須為0~100分的CHECK約束。ALTERTABLE<表名>ADDCONSTRAINT<約束名>CHECK(邏輯表達(dá)式)約束7.2.6非空約束(NOTNULLCONSTRAINT)非空(NOTNULL)約束是最簡(jiǎn)單的一種約束,該約束的效果是不接受該屬性為空值的元組,即指定不接受NULL值的列。該約束的定義在CREATETABLE語(yǔ)句中的屬性數(shù)據(jù)類(lèi)型后面進(jìn)行說(shuō)明。如果在某個(gè)基本表的某列上定義了非空約束,那么該列就不能接受NULL值。定義非空約束的語(yǔ)句如下:CREATETABLE學(xué)生表(學(xué)號(hào)INTNOTNULL,姓名CHAR(8)NULL,性別CHAR(1)NULL,班級(jí)CHAR(10)NULL,年齡INTNULL)注意:在“學(xué)號(hào)”字段上定義了一個(gè)非空約束,對(duì)于學(xué)生表的任何一行都不允許學(xué)號(hào)這個(gè)字段值為NULL值,而其他字段值則允許為空值。約束7.2.7約束的作用對(duì)象從上面的各種約束可以看出,約束的作用對(duì)象可以是列、元組和表,相應(yīng)地構(gòu)成列約束、元組約束和表約束。1.列約束列約束被指定為列定義的一部分,并且僅適用于某列。列約束主要是對(duì)列的數(shù)據(jù)類(lèi)型、取值范圍、精度等的約束。包括以下內(nèi)容。(1)對(duì)數(shù)據(jù)類(lèi)型的約束。(2)對(duì)數(shù)據(jù)格式的約束。(3)對(duì)取值范圍或取值集合的約束。(4)對(duì)空值的約束。約束7.2.7約束的作用對(duì)象2.元組約束元組約束是對(duì)元組中各個(gè)字段之間的聯(lián)系的約束。例如,圖7.25所示的最低工資必須小于或等于最高工資等。3.關(guān)系約束關(guān)系約束是指對(duì)若干元組、關(guān)系之間的聯(lián)系的約束。如學(xué)號(hào)的取值不能重復(fù)也不能取空值,選課表中學(xué)號(hào)的取值受學(xué)生表的學(xué)號(hào)取值的約束等。存儲(chǔ)過(guò)程7.3存儲(chǔ)過(guò)程7.3.1

存儲(chǔ)過(guò)程的概念7.3.2存儲(chǔ)過(guò)程的優(yōu)點(diǎn)7.3.3存儲(chǔ)過(guò)程的分類(lèi)7.3.4常用的系統(tǒng)存儲(chǔ)過(guò)程7.3.5創(chuàng)建與調(diào)用存儲(chǔ)過(guò)程7.3.6管理存儲(chǔ)過(guò)程存儲(chǔ)過(guò)程7.3.1存儲(chǔ)過(guò)程的概念SQLServer提供了一種方法,它可以將一些固定的操作集中起來(lái)由SQLServer數(shù)據(jù)庫(kù)服務(wù)器來(lái)完成,以實(shí)現(xiàn)某個(gè)任務(wù),這種方法就是存儲(chǔ)過(guò)程。存儲(chǔ)過(guò)程(StoredProcedure)是數(shù)據(jù)庫(kù)系統(tǒng)中的一組為了實(shí)現(xiàn)特定功能的SQL語(yǔ)句集,經(jīng)編譯后存儲(chǔ)在數(shù)據(jù)庫(kù)中,用戶(hù)可以通過(guò)指定存儲(chǔ)過(guò)程的名稱(chēng)并給出參數(shù)來(lái)執(zhí)行它,以實(shí)現(xiàn)某個(gè)任務(wù)。(1)存儲(chǔ)過(guò)程類(lèi)似程序語(yǔ)言中的函數(shù)。(2)用來(lái)執(zhí)行管理任務(wù)或應(yīng)用復(fù)雜的業(yè)務(wù)規(guī)則。(3)存儲(chǔ)過(guò)程可以帶參數(shù),也可以返回結(jié)果。(4)存儲(chǔ)過(guò)程可以包含數(shù)據(jù)操作語(yǔ)句、變量、邏輯控制語(yǔ)句等。存儲(chǔ)過(guò)程7.3.2存儲(chǔ)過(guò)程的優(yōu)點(diǎn)用戶(hù)可以出于任何使用SQL語(yǔ)句的目的來(lái)使用存儲(chǔ)過(guò)程,它具有以下優(yōu)點(diǎn)。(1)允許模塊化程序設(shè)計(jì)(2)提高系統(tǒng)性能(3)減少網(wǎng)絡(luò)流通量(4)提高系統(tǒng)安全性(5)可重用性存儲(chǔ)過(guò)程7.3.3存儲(chǔ)過(guò)程的分類(lèi)在SQLServer中,存儲(chǔ)過(guò)程分為兩類(lèi):系統(tǒng)存儲(chǔ)過(guò)程和用戶(hù)自定義存儲(chǔ)過(guò)程。1)系統(tǒng)存儲(chǔ)過(guò)程系統(tǒng)存儲(chǔ)過(guò)程是微軟內(nèi)置在SQLServer中的存儲(chǔ)過(guò)程。在SQLServer

2000中,系統(tǒng)存儲(chǔ)過(guò)程位于master數(shù)據(jù)庫(kù)中,以sp_為前綴,并標(biāo)記為system。SQLServer2005以后的版本對(duì)其進(jìn)行了改進(jìn),將系統(tǒng)存儲(chǔ)過(guò)程存儲(chǔ)于一個(gè)內(nèi)部隱藏的資源數(shù)據(jù)庫(kù)中,邏輯上存在于每個(gè)數(shù)據(jù)庫(kù)中,即系統(tǒng)存儲(chǔ)過(guò)程可以在任意一個(gè)數(shù)據(jù)庫(kù)中執(zhí)行。系統(tǒng)存儲(chǔ)過(guò)程由系統(tǒng)定義,存儲(chǔ)在master數(shù)據(jù)庫(kù)中,類(lèi)似C語(yǔ)言中的系統(tǒng)函數(shù)。系統(tǒng)存儲(chǔ)過(guò)程的名稱(chēng)都以“sp_”開(kāi)頭或“xp_”開(kāi)頭。2)用戶(hù)自定義存儲(chǔ)過(guò)程用戶(hù)自定義存儲(chǔ)過(guò)程是用戶(hù)在自己的數(shù)據(jù)庫(kù)中創(chuàng)建的存儲(chǔ)過(guò)程,類(lèi)似程序語(yǔ)言中的用戶(hù)自定義函數(shù)。存儲(chǔ)過(guò)程7.3.4常用的系統(tǒng)存儲(chǔ)過(guò)程系統(tǒng)存儲(chǔ)過(guò)程存儲(chǔ)在master數(shù)據(jù)庫(kù)中,并以sp_為前綴,主要用來(lái)從系統(tǒng)表中獲取信息,為系統(tǒng)管理員管理SQLServer提供幫助,為用戶(hù)查看數(shù)據(jù)庫(kù)對(duì)象提供方便。如用來(lái)查看數(shù)據(jù)庫(kù)對(duì)象信息的系統(tǒng)存儲(chǔ)過(guò)程sp_help、顯示存儲(chǔ)過(guò)程和其他對(duì)象文本的存儲(chǔ)過(guò)程sp_helptext等。系統(tǒng)存儲(chǔ)過(guò)程說(shuō)明sp_databases列出服務(wù)器上的所有數(shù)據(jù)庫(kù)sp_helpdb報(bào)告有關(guān)指定數(shù)據(jù)庫(kù)或所有數(shù)據(jù)庫(kù)的信息sp_renamedb更改數(shù)據(jù)庫(kù)的名稱(chēng)sp_tables返回當(dāng)前環(huán)境下可查詢(xún)的對(duì)象的列表sp_columns返回某個(gè)表列的信息sp_help查看某個(gè)表的所有信息sp_helpconstraint查看某個(gè)表的約束sp_helpindex查看某個(gè)表的索引sp_stored_procedures列出當(dāng)前環(huán)境中的所有存儲(chǔ)過(guò)程sp_password添加或修改登錄賬戶(hù)的密碼sp_helptext顯示默認(rèn)值、未加密的存儲(chǔ)過(guò)程、用戶(hù)定義的存儲(chǔ)過(guò)程、觸發(fā)器或視圖的實(shí)際文本存儲(chǔ)過(guò)程7.3.4常用的系統(tǒng)存儲(chǔ)過(guò)程在調(diào)用常用的系統(tǒng)存儲(chǔ)過(guò)程時(shí),可以使用EXEC,如下所示。EXECsp_databases --列出當(dāng)前系統(tǒng)中的數(shù)據(jù)庫(kù)EXECsp_renamedb'db1','db2' --修改數(shù)據(jù)庫(kù)的名稱(chēng)(單用戶(hù)訪(fǎng)問(wèn))USE示例數(shù)據(jù)庫(kù) --當(dāng)前數(shù)據(jù)庫(kù)中查詢(xún)的對(duì)象的列表GOEXECsp_tables --返回當(dāng)前環(huán)境下可查詢(xún)的對(duì)象的列表EXECsp_columns學(xué)生表 --返回學(xué)生表列的信息EXECsp_help學(xué)生表 --查看“學(xué)生表”的所有相關(guān)信息EXECsp_helpconstraint學(xué)生表

--查看“學(xué)生表”的約束EXECsp_helpindex學(xué)生表 --查看“學(xué)生表”的索引EXECsp_helptextS_G --查看“S_G視圖”定義的文本EXECsp_stored_procedures

--查看當(dāng)前數(shù)據(jù)庫(kù)中的存儲(chǔ)過(guò)程存儲(chǔ)過(guò)程7.3.5創(chuàng)建與調(diào)用存儲(chǔ)過(guò)程在SQLServer中,可以使用以下三種方法創(chuàng)建存儲(chǔ)過(guò)程。(1)使用SQLServer模板資源管理器創(chuàng)建存儲(chǔ)過(guò)程。(2)利用SQLServer對(duì)象資源管理器創(chuàng)建存儲(chǔ)過(guò)程。(3)使用SQL語(yǔ)句中的CREATE

PROCEDURE命令創(chuàng)建存儲(chǔ)過(guò)程。下面介紹使用SQL語(yǔ)句中的CREATE

PROCEDURE命令創(chuàng)建存儲(chǔ)過(guò)程的方法。基本語(yǔ)法格式如下。CREATEPROC[EDURE]<存儲(chǔ)過(guò)程名>--可以直接用簡(jiǎn)寫(xiě)的PROC[<@參數(shù)名稱(chēng)><數(shù)據(jù)類(lèi)型>][=<默認(rèn)值>][OUTPUT][,...n]AS<SQL語(yǔ)句>[,...n]GO存儲(chǔ)過(guò)程7.3.5創(chuàng)建與調(diào)用存儲(chǔ)過(guò)程【例7.21】創(chuàng)建一個(gè)名為“proc_test1”的存儲(chǔ)過(guò)程,該存儲(chǔ)過(guò)程有一個(gè)輸入?yún)?shù)@name,可以使用如下語(yǔ)句來(lái)完成。CREATEPROCproc_test1@nameVARCHAR(10)AS--語(yǔ)句省略GO存儲(chǔ)過(guò)程7.3.5創(chuàng)建與調(diào)用存儲(chǔ)過(guò)程在存儲(chǔ)過(guò)程創(chuàng)建完成后,可以使用EXECUTE語(yǔ)句來(lái)調(diào)用它,其基本語(yǔ)法格式如下。EXEC[UTE]{<存儲(chǔ)過(guò)程名>}--可以直接簡(jiǎn)寫(xiě)成EXEC{[@<參數(shù)名稱(chēng)>=<參數(shù)值>|@variable[OUTPUT]|[DEFAULT]}[,...n]其中,使用<參數(shù)值>作為實(shí)參來(lái)傳遞參數(shù)的值,格式為@<參數(shù)名稱(chēng)>=<參數(shù)值>;使用@variable作為保存OUTPUT返回值的變量;DEFAULT關(guān)鍵字不提供實(shí)參,表示使用對(duì)應(yīng)的默認(rèn)值。存儲(chǔ)過(guò)程7.3.5創(chuàng)建與調(diào)用存儲(chǔ)過(guò)程【例7.22】使用EXECUTE命令傳遞單個(gè)參數(shù),調(diào)用【例7.21】中的存儲(chǔ)過(guò)程proc_test1,并以titles為參數(shù)值。存儲(chǔ)過(guò)程proc_test1需要參數(shù)(@name),可以使用如下語(yǔ)句來(lái)完成。EXECproc_test1--當(dāng)然,在調(diào)用存儲(chǔ)過(guò)程中的變量時(shí)可以顯式命名EXECproc_test1@name=titles存儲(chǔ)過(guò)程7.3.5創(chuàng)建與調(diào)用存儲(chǔ)過(guò)程1.創(chuàng)建不帶參數(shù)的存儲(chǔ)過(guò)程CREATEPROCproc_stuASSELECT*FROM學(xué)生表GO【例7.23】創(chuàng)建一個(gè)沒(méi)有參數(shù)的存儲(chǔ)過(guò)程proc_stu,查詢(xún)學(xué)生表的基本信息,可以使用如下語(yǔ)句來(lái)完成。在創(chuàng)建完成后,系統(tǒng)會(huì)在當(dāng)前數(shù)據(jù)庫(kù)中創(chuàng)建一個(gè)名為“proc_stu”的存儲(chǔ)過(guò)程。單擊“刷新”按鈕,選擇對(duì)應(yīng)數(shù)據(jù)庫(kù),展開(kāi)“可編程性”→“存儲(chǔ)過(guò)程”節(jié)點(diǎn)即可查看。存儲(chǔ)過(guò)程7.3.5創(chuàng)建與調(diào)用存儲(chǔ)過(guò)程1.創(chuàng)建不帶參數(shù)的存儲(chǔ)過(guò)程EXECproc_stu執(zhí)行不帶參數(shù)的存儲(chǔ)過(guò)程最為簡(jiǎn)單,直接輸入如下SQL語(yǔ)句即可。執(zhí)行的結(jié)果和查詢(xún)學(xué)生表信息的結(jié)果一致。存儲(chǔ)過(guò)程7.3.5創(chuàng)建與調(diào)用存儲(chǔ)過(guò)程2.創(chuàng)建帶參數(shù)的存儲(chǔ)過(guò)程存儲(chǔ)過(guò)程的參數(shù)分為兩種:輸入?yún)?shù)和輸出參數(shù),下圖所示為帶參數(shù)的存儲(chǔ)過(guò)程。輸入?yún)?shù):用于向存儲(chǔ)過(guò)程中傳入值,類(lèi)似程序語(yǔ)言的按值傳遞。輸出參數(shù):用于在調(diào)用存儲(chǔ)過(guò)程后返回結(jié)果,類(lèi)似程序語(yǔ)言的按引用傳遞。存儲(chǔ)過(guò)程7.3.5創(chuàng)建與調(diào)用存儲(chǔ)過(guò)程2.創(chuàng)建帶參數(shù)的存儲(chǔ)過(guò)程1)創(chuàng)建帶輸入?yún)?shù)的存儲(chǔ)過(guò)程【例7.24】創(chuàng)建一個(gè)帶參數(shù)的存儲(chǔ)過(guò)程proc_name,通過(guò)學(xué)號(hào)查詢(xún)學(xué)生信息。這是典型的帶輸入?yún)?shù)的存儲(chǔ)過(guò)程,可以使用如下語(yǔ)句來(lái)完成。CREATEPROCproc_name@idINTASSELECT*FROM學(xué)生表WHERE學(xué)號(hào)=@idGOEXECproc_name@id=2021610--或者這樣調(diào)用EXECproc_name2021610調(diào)用存儲(chǔ)過(guò)程:存儲(chǔ)過(guò)程7.3.5創(chuàng)建與調(diào)用存儲(chǔ)過(guò)程2.創(chuàng)建帶參數(shù)的存儲(chǔ)過(guò)程2)創(chuàng)建帶輸出參數(shù)的存儲(chǔ)過(guò)程如果調(diào)用批命令將變量作為參數(shù)傳入存儲(chǔ)過(guò)程中,而參數(shù)在存儲(chǔ)過(guò)程中被修改,則修改不會(huì)傳給調(diào)用該存儲(chǔ)過(guò)程的命令,除非在生成和執(zhí)行存儲(chǔ)過(guò)程時(shí)對(duì)參數(shù)指定OUTPUT關(guān)鍵字。也就是說(shuō),如果希望在調(diào)用存儲(chǔ)過(guò)程后返回一個(gè)或多個(gè)值,則需要使用輸出(OUTPUT)參數(shù)。存儲(chǔ)過(guò)程7.3.5創(chuàng)建與調(diào)用存儲(chǔ)過(guò)程2.創(chuàng)建帶參數(shù)的存儲(chǔ)過(guò)程2)創(chuàng)建帶輸出參數(shù)的存儲(chǔ)過(guò)程【例7.25】創(chuàng)建一個(gè)帶輸出參數(shù)的存儲(chǔ)過(guò)程proc_num,根據(jù)傳入的學(xué)生姓名查詢(xún)?cè)搶W(xué)生的學(xué)號(hào),可以使用如下語(yǔ)句來(lái)完成。CREATEPROCproc_num@namevarchar(10),@id_outintoutputASBEGIN SELECT@id_out=學(xué)號(hào) FROM學(xué)生表 WHERE姓名=@nameENDGO存儲(chǔ)過(guò)程7.3.5創(chuàng)建與調(diào)用存儲(chǔ)過(guò)程2.創(chuàng)建帶參數(shù)的存儲(chǔ)過(guò)程2)創(chuàng)建帶輸出參數(shù)的存儲(chǔ)過(guò)程【例7.26】調(diào)用帶輸出參數(shù)的存儲(chǔ)過(guò)程proc_num。DECLARE@id_saveINTEXECproc_num@name='陳海華',@id_out=@id_saveOUTPUTPRINT@id_save--直接打印出來(lái)--或者用下面語(yǔ)句查詢(xún)結(jié)果SELECT學(xué)號(hào)=@id_saveFROM學(xué)生表WHERE姓名='陳海華'注意:調(diào)用帶輸出參數(shù)的存儲(chǔ)過(guò)程要聲明一個(gè)存儲(chǔ)返回值的變量,執(zhí)行語(yǔ)句還要包括OUTPUT關(guān)鍵字,否則修改無(wú)法在調(diào)用中反映出來(lái)。存儲(chǔ)過(guò)程7.3.5創(chuàng)建與調(diào)用存儲(chǔ)過(guò)程3.創(chuàng)建帶參數(shù)默認(rèn)值的存儲(chǔ)過(guò)程【例7.27】創(chuàng)建一個(gè)帶參數(shù)默認(rèn)值的存儲(chǔ)過(guò)程proc_score,并調(diào)用該存儲(chǔ)過(guò)程查詢(xún)指定成績(jī)范圍內(nèi)的學(xué)生信息。默認(rèn)值:最低成績(jī)?yōu)?0分,最高成績(jī)?yōu)?00分,可以用如下語(yǔ)句來(lái)完成。CREATEPROCproc_score@score1FLOAT=60,@score2FLOAT=100ASBEGINSELECT*FROM選課表WHERE成績(jī)BETWEEN@score1AND@score2ENDGO強(qiáng)調(diào):①默認(rèn)值應(yīng)放在參數(shù)數(shù)據(jù)類(lèi)型的后面,而不是放在參數(shù)變量的后面;②為了方便調(diào)用,推薦將默認(rèn)參數(shù)放置在參數(shù)列表的最后。存儲(chǔ)過(guò)程7.3.5創(chuàng)建與調(diào)用存儲(chǔ)過(guò)程3.創(chuàng)建帶參數(shù)默認(rèn)值的存儲(chǔ)過(guò)程調(diào)用帶參數(shù)默認(rèn)值的存儲(chǔ)過(guò)程,可以有以下幾種形式。EXECproc_score --兩者都用默認(rèn)值EXECproc_score70 --最低分為70分,最高分用默認(rèn)值EXECproc_score70,90 --最低分和最高分都不用默認(rèn)值EXECproc_score@score2=90 --最低分用默認(rèn)值,最高分為90分存儲(chǔ)過(guò)程7.3.6管理存儲(chǔ)過(guò)程在實(shí)際應(yīng)用中,常常會(huì)查看已經(jīng)創(chuàng)建的存儲(chǔ)過(guò)程,還要進(jìn)行必要的修改和刪除等操作。這些操作需要用不同的方法實(shí)現(xiàn)。1.查看存儲(chǔ)過(guò)程查看存儲(chǔ)過(guò)程有兩種方法。(1)使用可視化形式查看存儲(chǔ)過(guò)程(2)使用系統(tǒng)存儲(chǔ)過(guò)程。SQLServer提供了幾個(gè)系統(tǒng)存儲(chǔ)過(guò)程方便用戶(hù)管理數(shù)據(jù)庫(kù)的有關(guān)對(duì)象。①sp_help:用于查看有關(guān)存儲(chǔ)過(guò)程的名稱(chēng)列表,向用戶(hù)報(bào)告有關(guān)數(shù)據(jù)庫(kù)對(duì)象、用戶(hù)定義數(shù)據(jù)類(lèi)型或SQLServer2016所提供的數(shù)據(jù)類(lèi)型的摘要信息;②sp_helptext:用于顯示規(guī)則、默認(rèn)值、未加密的存儲(chǔ)過(guò)程、用戶(hù)定義函數(shù)、觸發(fā)器或視圖的過(guò)程定義代碼。存儲(chǔ)過(guò)程7.3.6管理存儲(chǔ)過(guò)程在實(shí)際應(yīng)用中,常常會(huì)查看已經(jīng)創(chuàng)建的存儲(chǔ)過(guò)程,還要進(jìn)行必要的修改和刪除等操作。這些操作需要用不同的方法實(shí)現(xiàn)。1.查看存儲(chǔ)過(guò)程查看存儲(chǔ)過(guò)程有兩種方法。(1)使用可視化形式查看存儲(chǔ)過(guò)程(2)使用系統(tǒng)存儲(chǔ)過(guò)程。SQLServer提供了幾個(gè)系統(tǒng)存儲(chǔ)過(guò)程方便用戶(hù)管理數(shù)據(jù)庫(kù)的有關(guān)對(duì)象。①sp_help:用于查看有關(guān)存儲(chǔ)過(guò)程的名稱(chēng)列表,向用戶(hù)報(bào)告有關(guān)數(shù)據(jù)庫(kù)對(duì)象、用戶(hù)定義數(shù)據(jù)類(lèi)型或SQLServer2016所提供的數(shù)據(jù)類(lèi)型的摘要信息;②sp_helptext:用于顯示規(guī)則、默認(rèn)值、未加密的存儲(chǔ)過(guò)程、用戶(hù)定義函數(shù)、觸發(fā)器或視圖的過(guò)程定義代碼。存儲(chǔ)過(guò)程7.3.6管理存儲(chǔ)過(guò)程查看存儲(chǔ)過(guò)程的對(duì)象信息,其語(yǔ)法格式如下。EXECUTEsp_help<存儲(chǔ)過(guò)程名稱(chēng)>查看存儲(chǔ)過(guò)程的代碼信息,其語(yǔ)法格式如下。EXECUTEsp_helptext<存儲(chǔ)過(guò)程名稱(chēng)>存儲(chǔ)過(guò)程7.3.6管理存儲(chǔ)過(guò)程【例7.28】查看存儲(chǔ)過(guò)程proc_score的對(duì)象信息,可以用如下語(yǔ)句。USE示例數(shù)據(jù)庫(kù)GOEXECUTEsp_helpproc_score存儲(chǔ)過(guò)程7.3.6管理存儲(chǔ)過(guò)程【例7.29】查看存儲(chǔ)過(guò)程proc_score的代碼信息,可以用如下語(yǔ)句。USE示例數(shù)據(jù)庫(kù)GOEXECUTEsp_helptextproc_score存儲(chǔ)過(guò)程7.3.6管理存儲(chǔ)過(guò)程2.修改存儲(chǔ)過(guò)程修改存儲(chǔ)過(guò)程也有兩種方法。ALTERPROC[EDURE]<存儲(chǔ)過(guò)程名稱(chēng)>[<@參數(shù)名稱(chēng)><數(shù)據(jù)類(lèi)型>][=<默認(rèn)值>][OUTPUT][,...n]AS<SQL語(yǔ)句>[,...n]GO(1)使用對(duì)象資源管理器來(lái)修改用戶(hù)創(chuàng)建的存儲(chǔ)過(guò)程。(2)使用命令語(yǔ)句來(lái)修改用戶(hù)創(chuàng)建的存儲(chǔ)過(guò)程。修改存儲(chǔ)過(guò)程的基本語(yǔ)法格式如下。存儲(chǔ)過(guò)程7.3.6管理存儲(chǔ)過(guò)程2.修改存儲(chǔ)過(guò)程【例7.30】修改存儲(chǔ)過(guò)程proc_score,使之無(wú)法被用戶(hù)查看代碼信息,即做加密處理,可以用如下語(yǔ)句來(lái)完成。ALTERPROCproc_score@score1FLOAT=60,@score2FLOAT=100WITHENCRYPTION--加密處理ASBEGINSELECT*FROM選課表WHERE成績(jī)BETWEEN@score1AND@score2ENDGO存儲(chǔ)過(guò)程7.3.6管理存儲(chǔ)過(guò)程3.重命名存儲(chǔ)過(guò)程修改存儲(chǔ)過(guò)程的名稱(chēng)可以使用系統(tǒng)存儲(chǔ)過(guò)程sp_rename,其語(yǔ)法形式如下。sp_rename原存儲(chǔ)過(guò)程名稱(chēng),新存儲(chǔ)過(guò)程名稱(chēng)【例7.31】重命名存儲(chǔ)過(guò)程proc_score為proc_score1,可以用如下語(yǔ)句。sp_renameproc_score,proc_score1存儲(chǔ)過(guò)程7.3.6管理存儲(chǔ)過(guò)程4.刪除存儲(chǔ)過(guò)程刪除存儲(chǔ)過(guò)程可以使用DROP命令,DROP命令可以將一個(gè)或者多個(gè)存儲(chǔ)過(guò)程和存儲(chǔ)過(guò)程組從當(dāng)前數(shù)據(jù)庫(kù)中刪除,其語(yǔ)法形式如下。DROPPROCEDURE<存儲(chǔ)過(guò)程名稱(chēng)>[,...n]【例7.32】刪除存儲(chǔ)過(guò)程proc_score1,可以用如下語(yǔ)句。DROPPROCEDUREproc_score1觸發(fā)器7.4觸發(fā)器7.4.1

觸發(fā)器的概念7.4.2觸發(fā)器的結(jié)構(gòu)7.4.3觸發(fā)器的原理7.4.4創(chuàng)建觸發(fā)器7.4.5管理觸發(fā)器觸發(fā)器7.4.1觸發(fā)器的概念觸發(fā)器(trigger)是SQLServer提供給程序員和數(shù)據(jù)分析員來(lái)保證數(shù)據(jù)完整性的一種方法,它是與表事件相關(guān)的特殊的存儲(chǔ)過(guò)程,它的執(zhí)行不是由程序調(diào)用的,也不是手動(dòng)啟動(dòng)的,而是由事件來(lái)觸發(fā)的。例如,當(dāng)對(duì)一個(gè)表執(zhí)行INSERT、DELETE和UPDATE操作時(shí)就會(huì)激活觸發(fā)器。SQLServer具有三種常規(guī)類(lèi)型的觸發(fā)器:DML觸發(fā)器、DDL觸發(fā)器和登錄觸發(fā)器。本書(shū)介紹的是DML觸發(fā)器,其在執(zhí)行INSERT、DELETE和UPDATE時(shí)被觸發(fā)。觸發(fā)器7.4.1觸發(fā)器的概念觸發(fā)器有很多用途,對(duì)于DML觸發(fā)器來(lái)說(shuō),常見(jiàn)的用途是強(qiáng)制業(yè)務(wù)規(guī)則。在實(shí)際應(yīng)用中,DML觸發(fā)器分為以下兩類(lèi)。(1)AFTER觸發(fā)器:這類(lèi)觸發(fā)器在記錄已經(jīng)被修改,且相關(guān)事務(wù)被提交之后才會(huì)被觸發(fā)。它主要用于記錄變更之后的處理或檢查,一旦發(fā)現(xiàn)錯(cuò)誤,可以用ROLLBACKTRANSACTION語(yǔ)句來(lái)回滾本次操作。對(duì)同一個(gè)表的操作可以定義多個(gè)AFTER觸發(fā)器及其執(zhí)行的先后順序。(2)INSTEADOF觸發(fā)器:這類(lèi)觸發(fā)器并不執(zhí)行其所定義的操作(INSERT、UPDATEDELETE),而執(zhí)行觸發(fā)器本身所定義的操作。它一般用來(lái)取代原本的操作,在記錄變更之前被觸發(fā)。觸發(fā)器7.4.1觸發(fā)器的概念DML觸發(fā)器有以下特點(diǎn)。(1)觸發(fā)器不能被直接調(diào)用,只有在對(duì)觸發(fā)器所在表的數(shù)據(jù)進(jìn)行更改時(shí),才會(huì)自動(dòng)執(zhí)行。(2)觸發(fā)器不能傳遞和接收參數(shù)。(3)觸發(fā)器可以實(shí)施更為復(fù)雜的數(shù)據(jù)完整性約束。(4)觸發(fā)器可以通過(guò)數(shù)據(jù)庫(kù)中的相關(guān)表實(shí)現(xiàn)級(jí)聯(lián)更改、多個(gè)表之間數(shù)據(jù)的一致性與完整性。(5)觸發(fā)器可以評(píng)估數(shù)據(jù)修改前后的表狀態(tài),并根據(jù)其差異采取對(duì)策。觸發(fā)器7.4.2觸發(fā)器的結(jié)構(gòu)一個(gè)觸發(fā)器由三部分組成:事件、條件和動(dòng)作。觸發(fā)器7.4.2觸發(fā)器的結(jié)構(gòu)1.事件在觸發(fā)器中,事件是指對(duì)數(shù)據(jù)庫(kù)的插入、刪除、修改等操作,觸發(fā)器在這些事件發(fā)生時(shí)開(kāi)始工作。在SQLServer中,觸發(fā)器的事件有三種類(lèi)型:INSERT事件、UPDATE事件和DELETE事件。INSERT事件:當(dāng)向某一個(gè)表中插入數(shù)據(jù)時(shí),如果該表有INSERT類(lèi)型的觸發(fā)器,那么該INSERT觸發(fā)器就觸發(fā)執(zhí)行。UPDATE事件:當(dāng)對(duì)某一個(gè)表進(jìn)行數(shù)據(jù)修改時(shí),如果該表有UPDATE類(lèi)型的觸發(fā)器,那么該UPDATE觸發(fā)器就觸發(fā)執(zhí)行。DELETE事件:當(dāng)對(duì)某一個(gè)表進(jìn)行數(shù)據(jù)刪除時(shí),如果該表有DELETE類(lèi)型的觸發(fā)器,那么該DELETE觸發(fā)器就觸發(fā)執(zhí)行。觸發(fā)器7.4.2觸發(fā)器的結(jié)構(gòu)2.條件條件是觸發(fā)器是否被觸發(fā)執(zhí)行的依據(jù)。如果條件成立,那么執(zhí)行相應(yīng)的動(dòng)作;如果條件不成立,那么觸發(fā)器什么也不做。在SQLServer中,表示條件的關(guān)鍵字有三個(gè):AFTER、BEFORE和INSTEADOF。1)AFTER條件AFTER關(guān)鍵字表示該觸發(fā)器在觸發(fā)事件被成功執(zhí)行之后執(zhí)行動(dòng)作部分的數(shù)據(jù)庫(kù)操作。在該觸發(fā)器被執(zhí)行之前,所有的級(jí)聯(lián)動(dòng)作和約束檢查都必須成功地執(zhí)行。AFTER關(guān)鍵字是默認(rèn)的關(guān)鍵字。觸發(fā)器7.4.2觸發(fā)器的結(jié)構(gòu)2.條件條件是觸發(fā)器是否被觸發(fā)執(zhí)行的依據(jù)。如果條件成立,那么執(zhí)行相應(yīng)的動(dòng)作;如果條件不成立,那么觸發(fā)器什么也不做。在SQLServer中,表示條件的關(guān)鍵字有三個(gè):AFTER、BEFORE和INSTEADOF。2)BEFORE條件BEFORE關(guān)鍵字表示該觸發(fā)器在觸發(fā)事件被執(zhí)行之前執(zhí)行動(dòng)作部分的數(shù)據(jù)庫(kù)操作。在該觸發(fā)器被執(zhí)行之后,所有的級(jí)聯(lián)動(dòng)作和約束檢查才能被執(zhí)行。觸發(fā)器7.4.2觸發(fā)器的結(jié)構(gòu)2.條件條件是觸發(fā)器是否被觸發(fā)執(zhí)行的依據(jù)。如果條件成立,那么執(zhí)行相應(yīng)的動(dòng)作;如果條件不成立,那么觸發(fā)器什么也不做。在SQLServer中,表示條件的關(guān)鍵字有三個(gè):AFTER、BEFORE和INSTEADOF。3)INSTEADOF條件INSTEADOF關(guān)鍵字表示在觸發(fā)事件發(fā)生時(shí),只執(zhí)行動(dòng)作部分的操作,而不執(zhí)行觸發(fā)事件的操作。這時(shí),觸發(fā)事件只是一個(gè)導(dǎo)火線(xiàn),它可以激發(fā)觸發(fā)器本身的操作,而并不被執(zhí)行。觸發(fā)器7.4.2觸發(fā)器的結(jié)構(gòu)3.動(dòng)作觸發(fā)器在被觸發(fā)之后所執(zhí)行的數(shù)據(jù)庫(kù)操作即動(dòng)作。在SQLServer中,一個(gè)觸發(fā)器能夠包含任意數(shù)量的SQL語(yǔ)句。觸發(fā)器7.4.3觸發(fā)器的原理在觸發(fā)器被觸發(fā)時(shí),系統(tǒng)會(huì)自動(dòng)在內(nèi)存中創(chuàng)建INSERTED表或者DELETED表,這兩個(gè)表均為只讀,不允許被修改,在觸發(fā)器被執(zhí)行完成后會(huì)自動(dòng)刪除。INSERTED表和DELETED表是觸發(fā)器專(zhuān)用的臨時(shí)虛擬表。在觸發(fā)器的執(zhí)行過(guò)程中,SQLServer會(huì)根據(jù)觸發(fā)器類(lèi)型的不同創(chuàng)建它們其中的一個(gè)或兩個(gè),建立情況如下表。觸發(fā)器類(lèi)型系統(tǒng)創(chuàng)建的臨時(shí)表INSERTINSERTED表UPDATEINSERTED表和DELETED表DELETEDELETED表觸發(fā)器7.4.3觸發(fā)器的原理在使用INSERT操作向觸發(fā)表中插入數(shù)據(jù)行時(shí),系統(tǒng)將根據(jù)觸發(fā)表的結(jié)構(gòu)為觸發(fā)器建立INSERTED表,并在INSERTED表中保存所插入的新數(shù)據(jù)行的副本。同理,在使用DELETE操作刪除數(shù)據(jù)行時(shí),系統(tǒng)將在DELETED表中保存所刪除的舊的數(shù)據(jù)行。我們可以將UPDATE操作看作是DELETE和INSERT共同操作的結(jié)果,所以在INSERTED表中存放了更新后的新行值,在DELETED表中存放了更新前的舊行值。INSERTED表和DELETED表的觸發(fā)原理如表。操作INSERTED表DELETED表增加(INSERT)記錄存放新增的記錄/刪除(DELETE)記錄/存放被刪除的記錄更新(UPDATE)記錄存放更新后的記錄存放更新前的記錄注意:INSERTED表與DELETED表只能由創(chuàng)建它們的觸發(fā)器引用,在觸發(fā)器工作完成之后,與該觸發(fā)器相關(guān)的兩個(gè)表都會(huì)被刪除觸發(fā)器7.4.4創(chuàng)建觸發(fā)器1.創(chuàng)建觸發(fā)器的基本語(yǔ)法格式:CREATETRIGGEER<觸發(fā)器名>ON{表名|視圖名}{FOR|AFTER|INSTEADOF}[INSERT|DELETE|UPDATE]AS[IFUPDATE(列名)]<SQL語(yǔ)句>FOR關(guān)鍵字與AFTER的效果相同,所以具有FOR關(guān)鍵字的觸發(fā)器也可以歸類(lèi)為AFTER觸發(fā)器。IF

UPDATE(列名):指定當(dāng)對(duì)基本表內(nèi)的某個(gè)字段或某幾個(gè)字段進(jìn)行插入或修改時(shí),觸發(fā)才起作用。觸發(fā)器7.4.4創(chuàng)建觸發(fā)器2.創(chuàng)建觸發(fā)器示例【例7.33】創(chuàng)建一個(gè)名為NOTDEL的DELETE觸發(fā)器,一次不能刪除學(xué)生表中多于一個(gè)學(xué)生的信息,如果刪除多于一條記錄,則提示“你不能刪除多于一個(gè)的學(xué)生!”并回滾事務(wù),可用如下語(yǔ)句來(lái)完成。CREATETRIGGERNOTDELON學(xué)生表FORDELETE--DELETE觸發(fā)器ASIF(SELECTCOUNT(*)FROMDELETED)>1BEGINRAISERROR('你不能刪除多于一個(gè)的學(xué)生!',16,1)ROLLBACKTRANSACTIONEND觸發(fā)器7.4.4創(chuàng)建觸發(fā)器2.創(chuàng)建觸發(fā)器示例【例7.34】創(chuàng)建一個(gè)名為NEWINS的觸發(fā)器,在向選課表中插入記錄之后引發(fā)該觸發(fā)器,檢查所插入的記錄中的學(xué)號(hào)是否出現(xiàn)在學(xué)生表中。如果在學(xué)生表中找不到相應(yīng)的學(xué)號(hào),則提示“學(xué)號(hào)輸入有誤!”并回滾事務(wù),可用如下語(yǔ)句來(lái)完成。CREATETRIGGERNEWINSON選課表AFTERINSERT--INSERT觸發(fā)器ASIF(SELECTCOUNT(*)FROM學(xué)生表,INSERTEDWHERE學(xué)生表.學(xué)號(hào)=INSERTED.學(xué)號(hào))=0BEGINPRINT'學(xué)號(hào)輸入有誤!'ROLLBACKTRANSACTIONEND觸發(fā)器7.4.4創(chuàng)建觸發(fā)器2.創(chuàng)建觸發(fā)器示例【例7.35】創(chuàng)建一個(gè)名為NewUpdate的觸發(fā)器,在對(duì)選課表進(jìn)行成績(jī)修改之后引發(fā)該觸發(fā)器,不允許提高選課表中的成績(jī)。如果成績(jī)提高了,則提示“你不能把成績(jī)提高”并回滾事務(wù),可用如下語(yǔ)句來(lái)完成。CREATETriggerNewUpdateON選課表AFTERUPDATE--UPDATE觸發(fā)器ASIFexists(select*FROMINSERTEDinnerjoinDELETEDonINSERTED.學(xué)號(hào)=DELETED.學(xué)號(hào)andInserted.課程號(hào)=deleted.課程號(hào)whereinserted.成績(jī)>DELETED.成績(jī))BEGINRAISERROR('你不能把成績(jī)提高',16,1)ROLLBACKTRANSACTIONEND觸發(fā)器7.4.5管理觸發(fā)器1.查看觸發(fā)器如果要查看表中已有的觸發(fā)器,以及這些觸發(fā)器對(duì)表的操作,則需要查看觸發(fā)器信息,有兩種常用方法。1)使用可視化形式查看觸發(fā)器觸發(fā)器7.4.5管理觸發(fā)器1.查看觸發(fā)器2)使用系統(tǒng)存儲(chǔ)過(guò)程查看觸發(fā)器信息由于觸發(fā)器是一種特殊的存儲(chǔ)過(guò)程,因此可以使用系統(tǒng)存儲(chǔ)過(guò)程sp_help和sp_helptext來(lái)查看觸發(fā)器信息。sp_help:用于查看觸發(fā)器的一般信息,如觸發(fā)器的名稱(chēng)、屬性、類(lèi)型和創(chuàng)建時(shí)間等。語(yǔ)法格式如下。EXECUTEsp_help<觸發(fā)器名稱(chēng)>sp_helptext:用于查看觸發(fā)器創(chuàng)建時(shí)的代碼信息。語(yǔ)法格式如下。EXECUTEsp_helptext<觸發(fā)器名稱(chēng)>觸發(fā)器7.4.5管理觸發(fā)器2.修改觸發(fā)器修改觸發(fā)器同樣可以在SSMS中完成,其步驟與查看觸發(fā)器一致;還可以用語(yǔ)句來(lái)完成,使用ALTER

TRIGGER語(yǔ)句可以更改先前通過(guò)執(zhí)行CREATE

TRIGGER語(yǔ)句創(chuàng)建的觸發(fā)器?!纠?.36】修改在【例7.35】中創(chuàng)建的觸發(fā)器NewUpdate,在對(duì)選課表中的成績(jī)進(jìn)行修改之后,給出提示“你已經(jīng)修改了成績(jī)!”,可用如下語(yǔ)句來(lái)完成。ALTERTriggerNewUpdateON選課表AFTERUPDATEASIFUPDATE(成績(jī))BEGINPRINT‘你已經(jīng)修改了成績(jī)!’END觸發(fā)器7.4.5管理觸發(fā)器3.重命名觸發(fā)器使用系統(tǒng)存儲(chǔ)過(guò)程sp_rename修改觸發(fā)器的名稱(chēng),其語(yǔ)法形式如下。sp_renameNewUpdate,NewUpdate1sp_rename原觸發(fā)器名稱(chēng),新觸發(fā)器名稱(chēng)【例7.37】重命名觸發(fā)器NewUpdate為NewUpdate1,可用如下語(yǔ)句。觸發(fā)器7.4.5管理觸發(fā)器4.刪除觸發(fā)器使用DROP命令刪除觸發(fā)器,DROP命令可以將一個(gè)或者多個(gè)觸發(fā)器從當(dāng)前數(shù)據(jù)庫(kù)中刪除,其語(yǔ)法形式如下。DROPTRRIGERNewUpdate1DROPTRRIGER<觸發(fā)器>[,...n]【例7.38】刪除觸發(fā)器NewUpdate1,可用如下語(yǔ)句。安全控制7.5安全控制7.5.1

數(shù)據(jù)庫(kù)的安全性控制7.5.2SQL中的安全性控制安全控制7.5.1數(shù)據(jù)庫(kù)的安全性控制1.數(shù)據(jù)庫(kù)系統(tǒng)的安全層次模型關(guān)系數(shù)據(jù)庫(kù)系統(tǒng)對(duì)于安全控制一般分為以下幾個(gè)層次,如圖所示。當(dāng)用戶(hù)要求使用數(shù)據(jù)庫(kù)系統(tǒng)時(shí),系統(tǒng)要根據(jù)用戶(hù)的標(biāo)識(shí)進(jìn)行身份驗(yàn)證,只有系統(tǒng)的合法用戶(hù)才能被確認(rèn)。用戶(hù)通過(guò)身份驗(yàn)證后,由RDBMS控制用戶(hù)的存儲(chǔ)權(quán)限,也就是說(shuō),用戶(hù)只能在自己的權(quán)限范圍內(nèi)執(zhí)行數(shù)據(jù)庫(kù)的操作。操作系統(tǒng)的安全性控制除了在用戶(hù)登錄時(shí)進(jìn)行身份驗(yàn)證,還在數(shù)據(jù)庫(kù)的底層存取中進(jìn)行安全控制。在最后一個(gè)層次中,數(shù)據(jù)可以以密文的形式存儲(chǔ)到數(shù)據(jù)庫(kù)中。另外,數(shù)據(jù)庫(kù)中的數(shù)據(jù)也可以通過(guò)密文的形式在網(wǎng)絡(luò)上傳送。用戶(hù)級(jí)RDBMS級(jí)OS級(jí)DB級(jí)用戶(hù)標(biāo)識(shí)和鑒定存取控制操作系統(tǒng)安全保護(hù)密文存儲(chǔ)安全控制7.5.1數(shù)據(jù)庫(kù)的安全性控制2.用戶(hù)的標(biāo)識(shí)和鑒別數(shù)據(jù)庫(kù)系統(tǒng)不允許一個(gè)未經(jīng)授權(quán)的用戶(hù)對(duì)數(shù)據(jù)庫(kù)進(jìn)行操作。用戶(hù)在訪(fǎng)問(wèn)數(shù)據(jù)庫(kù)之前,必須標(biāo)識(shí)出自己的名字或身份,由系統(tǒng)核實(shí),通過(guò)鑒別后才能獲得對(duì)數(shù)據(jù)庫(kù)進(jìn)行操作和使用的權(quán)限。用戶(hù)在連接數(shù)據(jù)庫(kù)時(shí),要提供用戶(hù)名和口令來(lái)表明自己的身份,這個(gè)過(guò)程稱(chēng)為用戶(hù)的標(biāo)識(shí)。系統(tǒng)在獲得用戶(hù)的身份標(biāo)識(shí)之后,通過(guò)與數(shù)據(jù)庫(kù)中登記的身份進(jìn)行對(duì)比,鑒別用戶(hù)的身份是否合法,這個(gè)過(guò)程稱(chēng)為用戶(hù)的鑒別??诹睿≒ASSWORD)是一種鑒別用戶(hù)身份的通用方法,但這種方法存在較大的安全隱患,用戶(hù)名和口令容易被人竊取。因此,系統(tǒng)一般會(huì)提供一些復(fù)雜的口令管理措施,來(lái)保護(hù)用戶(hù)的口令。安全控制7.5.1數(shù)據(jù)庫(kù)的安全性控制3.RDBMS的存取控制1)隱含特權(quán)隱含特權(quán)是系統(tǒng)內(nèi)置權(quán)限,是用戶(hù)不需要通過(guò)授權(quán)就可以擁有的數(shù)據(jù)操作權(quán)。用戶(hù)擁有的隱含特權(quán)與自己的身份有關(guān)。例如,數(shù)據(jù)庫(kù)管理員(DBA)可以進(jìn)行數(shù)據(jù)庫(kù)內(nèi)的任何操作,數(shù)據(jù)庫(kù)擁有者和數(shù)據(jù)庫(kù)對(duì)象的擁有者可以對(duì)自己的數(shù)據(jù)庫(kù)進(jìn)行任何操作。系統(tǒng)特權(quán)又稱(chēng)語(yǔ)句特權(quán),它相當(dāng)于數(shù)據(jù)定義語(yǔ)句(DDL)的語(yǔ)句權(quán)限。系統(tǒng)特權(quán)是允許用戶(hù)在數(shù)據(jù)庫(kù)內(nèi)部實(shí)施管理行為的特權(quán),包括創(chuàng)建或刪除數(shù)據(jù)庫(kù)、創(chuàng)建或刪除用戶(hù)、刪除或修改數(shù)據(jù)庫(kù)對(duì)象等。不同的DBMS規(guī)定的系統(tǒng)權(quán)限不同。2)系統(tǒng)特權(quán)安全控制7.5.1數(shù)據(jù)庫(kù)的安全性控制3.RDBMS的存取控制3)對(duì)象特權(quán)對(duì)象特權(quán)類(lèi)似數(shù)據(jù)庫(kù)操作語(yǔ)言(DML)的語(yǔ)句權(quán)限,指定用戶(hù)對(duì)數(shù)據(jù)庫(kù)中的基本表、視圖等對(duì)象的操作權(quán)限。對(duì)象特權(quán)指定用戶(hù)在哪些數(shù)據(jù)對(duì)象上具有哪些權(quán)限,不同的操作對(duì)象具有不同的操作權(quán)限。對(duì)象名操作權(quán)限表SELECT,INSERT,UPDATE,DELETE,ALL,ALTER,INDEX視圖SELECT,INSERT,UPDATE,DELETE,ALL列SELECT,INSERT,UPDATE,DELETE安全控制7.5.2SQL中的安全性控制在SQLServer中,有兩個(gè)功能提供了安全性控制:視圖和授權(quán)子系統(tǒng)。1)視圖視圖可以定義用戶(hù)使用的數(shù)據(jù),這樣用戶(hù)就不能使用視圖定義之外的數(shù)據(jù),從而保證數(shù)據(jù)庫(kù)的安全性。2)授權(quán)子系統(tǒng)為了能對(duì)數(shù)據(jù)庫(kù)進(jìn)行操作,用戶(hù)必須擁有適當(dāng)?shù)拇嫒?quán)限。授權(quán)子系統(tǒng)允許有特定存取權(quán)限的用戶(hù)有選擇并動(dòng)態(tài)地把這些權(quán)力授予其他用戶(hù)。RDBMS的存取控制通過(guò)SQL的授予權(quán)限語(yǔ)句、撤銷(xiāo)權(quán)限語(yǔ)句及拒絕訪(fǎng)問(wèn)語(yǔ)句來(lái)控制用戶(hù)的存取權(quán)限。安全控制7.5.2SQL中的安全性控制1.授權(quán)子系統(tǒng)授予權(quán)限就是給予用戶(hù)一定的訪(fǎng)問(wèn)特權(quán),這是對(duì)用戶(hù)訪(fǎng)問(wèn)權(quán)限的規(guī)定和限制。在SQLServer中,有兩種授予權(quán)限:一種是授予某類(lèi)數(shù)據(jù)庫(kù)用戶(hù)的權(quán)限,只有得到這類(lèi)權(quán)限,才能成為數(shù)據(jù)庫(kù)用戶(hù),這類(lèi)權(quán)限只能由DBA授予;另一種是授予對(duì)某些數(shù)據(jù)庫(kù)對(duì)象進(jìn)行某些操作的權(quán)限,既可以由DBA授予,又可以由數(shù)據(jù)庫(kù)對(duì)象的創(chuàng)建者授予。安全控制7.5.2SQL中的安全性控制1.授權(quán)子系統(tǒng)SQLServer使用GRANT語(yǔ)句授予用戶(hù)對(duì)數(shù)據(jù)庫(kù)對(duì)象(如表、視圖等)的操作權(quán)限。GRANT語(yǔ)句的基本語(yǔ)法格式如下。GRANT操作權(quán)限列表ON{表名|視圖名}TO用戶(hù)名列表[WITHGRANTOPTION]GRANT語(yǔ)句的功能是將指定對(duì)象上的指定權(quán)限授予指定的用戶(hù)。關(guān)鍵字WITHGRANTOPTION為可選項(xiàng),其意義是指定獲得相應(yīng)權(quán)限的用戶(hù)還可以將此權(quán)限授予其他用戶(hù),若省略此關(guān)鍵字,則用戶(hù)不能將此權(quán)限授予其他用戶(hù)。安全控制7.5.2SQL中的安全性控制1.授權(quán)子系統(tǒng)【例7.39】將查詢(xún)和更新學(xué)生表的權(quán)限授予用戶(hù)user1和用戶(hù)user2,并允許該用戶(hù)將權(quán)限授予其他用戶(hù)。如果要將對(duì)某兩個(gè)基本表T1、T2的全部權(quán)限授予所有用戶(hù)。GRANTSELECT,UPDATEON學(xué)生表TOuser1,user2WITHGRANTOPTIONGRANTALLPRIVILEGESONT1,T2TOPUBLIC安全控制7.5.2SQL中的安全性控制1.授權(quán)子系統(tǒng)【例7.40】將修改學(xué)生表中“年齡”和查詢(xún)學(xué)生表的權(quán)限授予用戶(hù)張三,可用如下語(yǔ)句來(lái)完成。如果要將DBA權(quán)限授予用戶(hù)WANG。GRANTUPDATE(年齡),SELECTON學(xué)生表TO張三GRANTDBATOWANGIDENTIFIEDBYWELCOME安全控制7.5.2SQL中的安全性控制2.撤銷(xiāo)權(quán)限用戶(hù)的某種權(quán)限可以由DBA或授權(quán)者使用REVOKE語(yǔ)句來(lái)進(jìn)行撤銷(xiāo)。REVOKE語(yǔ)句的基本語(yǔ)法格式如下。REVOKE操作權(quán)限列表ON{表名|視圖名}FROM用戶(hù)名列表安全控制7.5.2SQL中的安全性控制2.撤銷(xiāo)權(quán)限【例7.41】撤銷(xiāo)用戶(hù)user3對(duì)基本表T1、T2的INSERT權(quán)限,可用如下語(yǔ)句來(lái)完成REVOKEINSERTONT1,T2FROMuser3如果要撤銷(xiāo)所有用戶(hù)對(duì)選課表的SELECT權(quán)限和DELETE權(quán)限,則可用如下語(yǔ)句來(lái)完成。REVOKESELECT,DELETEON選課表FROMPUBLIC安全控制7.5.2SQL中的安全性控制3.拒絕方問(wèn)在授予了用戶(hù)對(duì)象權(quán)限之后,DBA或授權(quán)用戶(hù)可以根據(jù)實(shí)際情況在不撤銷(xiāo)用戶(hù)訪(fǎng)問(wèn)權(quán)限的情況下,拒絕用戶(hù)訪(fǎng)問(wèn)數(shù)據(jù)庫(kù)對(duì)象。拒絕用戶(hù)訪(fǎng)問(wèn)的語(yǔ)句為DENY,其基本語(yǔ)法格式如下。DENY操作權(quán)限列表ON{表名|視圖名}TO用戶(hù)名列表安全控制7.5.2SQL中的安全性控制3.拒絕方問(wèn)【例7.42】禁止用戶(hù)user3對(duì)基本表T3的INSERT權(quán)限,可用如下語(yǔ)句來(lái)完成。DENYINSERTONT3TOuser3事務(wù)和鎖7.6事務(wù)和鎖事務(wù)和鎖是靈活應(yīng)用SQL語(yǔ)句的關(guān)鍵,在程序設(shè)計(jì)和開(kāi)發(fā)中起著重要的作用。數(shù)據(jù)庫(kù)是可供用戶(hù)共享的信息資源。當(dāng)用戶(hù)并發(fā)地存取數(shù)據(jù)庫(kù)時(shí),就會(huì)產(chǎn)生多個(gè)事務(wù)同時(shí)存取同一數(shù)據(jù)的情況。數(shù)據(jù)庫(kù)的并發(fā)控制就是控制數(shù)據(jù)庫(kù),并防止在多用戶(hù)并發(fā)使用數(shù)據(jù)庫(kù)時(shí)造成數(shù)據(jù)錯(cuò)誤和程序運(yùn)行錯(cuò)誤,保證數(shù)據(jù)的完整性。事務(wù)是多用戶(hù)系統(tǒng)中數(shù)據(jù)操作的基本單元。封鎖使事務(wù)對(duì)它要操作的數(shù)據(jù)有一定的控制能力。7.6.1事務(wù)7.6.2鎖事務(wù)和鎖7.6.1事務(wù)1.事務(wù)的概念事務(wù)是一系列SQL操作的邏輯工作單元,一個(gè)邏輯工作單元必須有4個(gè)屬性,即原子性(Atomicity)、一致性(Consistency)、隔離性(Isolation)、持久性(Durability),簡(jiǎn)稱(chēng)ACID。(1)原子性(Atomicity):事務(wù)必須是一個(gè)完整的工作單元,事務(wù)對(duì)數(shù)據(jù)的操作要么全部執(zhí)行,要么全部不執(zhí)行,不可以被分割。(2)一致性(Consistency):在事務(wù)完成時(shí),所有的數(shù)據(jù)都必須保持一致。在相關(guān)的數(shù)據(jù)庫(kù)中,所有的規(guī)則都必須由事務(wù)進(jìn)行修改,以保證所有數(shù)據(jù)的完整性。當(dāng)事務(wù)結(jié)束時(shí),所有的內(nèi)部數(shù)據(jù)結(jié)構(gòu)都必須是正確的。(3)隔離性(Isolation):一個(gè)事務(wù)內(nèi)部各操作的執(zhí)行不會(huì)被其他事務(wù)干擾,即一個(gè)事務(wù)內(nèi)部的操作及使用的數(shù)據(jù)對(duì)其他并發(fā)事務(wù)是隔離的,并發(fā)執(zhí)行的各個(gè)事務(wù)之間不能互相干擾。(4)持久性(Durability):一個(gè)事務(wù)一旦提交成功后,事務(wù)對(duì)數(shù)據(jù)庫(kù)中的數(shù)據(jù)操作會(huì)被永久保存下來(lái)。事務(wù)和鎖7.6.1事務(wù)1.事務(wù)的概念【例7.43】轉(zhuǎn)賬問(wèn)題:從賬戶(hù)A轉(zhuǎn)100元到賬戶(hù)B上。整個(gè)操作的過(guò)程如下。(1)一致性要求:事務(wù)執(zhí)行前后A與B之和保持不變。(2)原子性要求:若事務(wù)在第3步之后與第6步之前失敗,則系統(tǒng)應(yīng)確保事務(wù)所做的更新不被反映到數(shù)據(jù)庫(kù)中,否則會(huì)出現(xiàn)不一致。(3)持久性要求:一旦用戶(hù)被告知事務(wù)已經(jīng)完成(100元轉(zhuǎn)賬已經(jīng)發(fā)生),則即使發(fā)生故障,事務(wù)對(duì)數(shù)據(jù)庫(kù)的更新也必須持久化。(4)隔離性要求:若在第3步與第6步之間允許另一個(gè)事務(wù)存取部分更新的數(shù)據(jù)庫(kù),則該事務(wù)將看到不一致的數(shù)據(jù)庫(kù)(A與B之和小于正確值)。1.read(A)2.A:=A–1003.write(A)4.read(B)5.B:=B+1006.write(B)防詐小貼士:不要輕易給陌生人轉(zhuǎn)賬!事務(wù)和鎖7.6.1事務(wù)2.事務(wù)管理語(yǔ)句在SQL中,常用的事務(wù)管理語(yǔ)句包含以下4條

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論