《數(shù)據(jù)庫系統(tǒng)-基礎(chǔ)、設(shè)計(jì)及應(yīng)用》課件第5章_第1頁
《數(shù)據(jù)庫系統(tǒng)-基礎(chǔ)、設(shè)計(jì)及應(yīng)用》課件第5章_第2頁
《數(shù)據(jù)庫系統(tǒng)-基礎(chǔ)、設(shè)計(jì)及應(yīng)用》課件第5章_第3頁
《數(shù)據(jù)庫系統(tǒng)-基礎(chǔ)、設(shè)計(jì)及應(yīng)用》課件第5章_第4頁
《數(shù)據(jù)庫系統(tǒng)-基礎(chǔ)、設(shè)計(jì)及應(yīng)用》課件第5章_第5頁
已閱讀5頁,還剩191頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

5.1數(shù)據(jù)庫完整性的概念

5.2DBMS中的數(shù)據(jù)完整性

5.3觸發(fā)器

5.4數(shù)據(jù)庫安全性控制

5.5SQLServer安全機(jī)制

實(shí)驗(yàn)5數(shù)據(jù)庫完整性與安全性

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

數(shù)據(jù)庫完整性是一種衡量數(shù)據(jù)庫質(zhì)量的標(biāo)志,是確保數(shù)據(jù)庫中數(shù)據(jù)的一致、正確并遵守業(yè)務(wù)規(guī)則的思想,是使無序數(shù)據(jù)條理化,確保正確的數(shù)據(jù)存放在正確位置的手段。為了維護(hù)數(shù)據(jù)庫完整性,DBMS必須提供合理的機(jī)制來檢查數(shù)據(jù)庫中的數(shù)據(jù)是否滿足語義約束所規(guī)定的條件。這些附著在數(shù)據(jù)庫中數(shù)據(jù)之上的語義約束內(nèi)容稱為完整性約束條件,它們作為模式的一部分存入數(shù)據(jù)庫中。例如,在定義“學(xué)生”表時(shí),可以設(shè)置以下完整性約束條件:5.1數(shù)據(jù)庫完整性的概念●學(xué)生的學(xué)號(hào)必須唯一,即“學(xué)號(hào)”字段的值既不能為空也不能重復(fù)。

●性別只能為男或女,即“性別”字段只能取值為“男”或“女”。

●學(xué)生年齡在14~30之間,即“年齡”字段的取值范圍為14~30之間的整數(shù)。

●學(xué)生所屬班級(jí)必須是學(xué)校公布的“班級(jí)目錄”中列出的班級(jí),即“班號(hào)”字段的值必須是按學(xué)校公布的“班級(jí)目錄”創(chuàng)建的“班級(jí)”表中已有的。

DBMS應(yīng)該提供相應(yīng)的手段來保障必要的數(shù)據(jù)完整性需求。滿足基本的數(shù)據(jù)完整性需求的數(shù)據(jù)庫具有以下特點(diǎn):

(1)數(shù)據(jù)取值準(zhǔn)確無誤,即所有數(shù)據(jù)都屬于合適的數(shù)據(jù)類型且只在規(guī)定范圍內(nèi)取值。

(2)數(shù)據(jù)與數(shù)據(jù)之間的關(guān)系都是和諧的,例如,同一表中的不同數(shù)據(jù)之間互為補(bǔ)充;不同表中的相同數(shù)據(jù)之間互為參照;等等。5.1.1數(shù)據(jù)庫完整性的幾種情況

1.要求的數(shù)據(jù)

最簡單的數(shù)據(jù)庫完整性要求字段不能為空,即不能取NULL值。例如,如果指定了學(xué)生表中的“姓名”字段不能為空,則在錄入表中的每條記錄時(shí),不填寫姓名都是DBMS所不能接受的。

2.有效性檢查

數(shù)據(jù)庫中每個(gè)字段都有一個(gè)域(取值范圍)。例如,如果定義了“年齡”字段為整型,則當(dāng)輸入的值為20.9時(shí),DBMS是不會(huì)接受的。還可以為某個(gè)字段指定一個(gè)比相應(yīng)數(shù)據(jù)類型更小的實(shí)際域,例如,可以為整型的“成績”字段指定取值范圍在“0~100”之間,則當(dāng)輸入的成績值為150時(shí),DBMS是不接受的。

3.實(shí)體完整性

表中主鍵的值必須是唯一的,也就是說,一條記錄中主鍵的值既不能為空,也不能與其他記錄的相同,否則,將無法通過主鍵來唯一標(biāo)識(shí)表中的記錄??梢灾付―BMS強(qiáng)制執(zhí)行唯一取值約束。

4.引用(參照)完整性

關(guān)系數(shù)據(jù)庫中,一個(gè)表的外鍵用于連接包含相應(yīng)字段的另一個(gè)表。例如,“學(xué)生”表可以通過作為外鍵的“班號(hào)”字段連接到“班號(hào)”是主鍵的“班級(jí)”表。可以指定DBMS強(qiáng)制執(zhí)行這種外鍵/主鍵約束。例如,如果強(qiáng)制執(zhí)行“學(xué)生”表和“班級(jí)”表之間的外鍵/主鍵,則可保證“學(xué)生”表中每條記錄的“班號(hào)”值都是“班級(jí)”表已經(jīng)存在的,也可據(jù)此查詢學(xué)生所在班級(jí)的情況。

5.其他數(shù)據(jù)關(guān)系

數(shù)據(jù)庫所描述的現(xiàn)實(shí)世界中往往存在某些特殊的限制,也會(huì)對(duì)數(shù)據(jù)庫中數(shù)據(jù)的合法性產(chǎn)生影響。例如,學(xué)??梢砸?guī)定每個(gè)學(xué)生各門課程都要及格才能選修某門課程,并且可以指定DBMS強(qiáng)制執(zhí)行這個(gè)約束,使得“選課”表中出現(xiàn)了“學(xué)號(hào)”的學(xué)生都符合這一要求。

6.業(yè)務(wù)規(guī)則

數(shù)據(jù)庫中數(shù)據(jù)的更新也可能會(huì)受到它所描述的行業(yè)的業(yè)務(wù)規(guī)則的影響。例如,學(xué)校可以規(guī)定只有某些班級(jí)才能選修某門課程,并且可以指定DBMS強(qiáng)制執(zhí)行這個(gè)約束,使得“選課”表中出現(xiàn)了“學(xué)號(hào)”的學(xué)生都屬于規(guī)定范圍內(nèi)的班級(jí)。

7.?dāng)?shù)據(jù)一致性

現(xiàn)實(shí)世界中某些事務(wù)會(huì)引起相應(yīng)數(shù)據(jù)庫的多次更新。例如,一個(gè)學(xué)生選修了一門課,則至少需要對(duì)數(shù)據(jù)庫進(jìn)行兩次更新:

●使用INSERT語句,在登記所有學(xué)生成績的“學(xué)生成績登記”表中插入一條記錄,輸入學(xué)號(hào)、姓名、課程號(hào)、課程名、任課教師、成績等字段的值。

●使用UPDATE語句,在登記所有課程選修情況的“課程選修情況”表中修改這門課的選課人數(shù)。5.1.2完整性約束條件及完整性控制

1.完整性約束條件

完整性檢查是圍繞著完整性約束條件進(jìn)行的,因此完整性約束條件是完整性控制機(jī)制的核心。完整性約束條件作用的對(duì)象可以是關(guān)系、元組和列三種。

●列約束主要是列的數(shù)據(jù)類型、取值范圍、精度、排序等約束條件。

●元組約束是元組中各個(gè)字段間的聯(lián)系的約束。

●關(guān)系約束是若干元組之間、關(guān)系集合上以及關(guān)系之間的聯(lián)系的約束。

2.DBMS的完整性控制機(jī)制

可將DBMS中執(zhí)行完整性檢查的部分稱為“完整性子系統(tǒng)”。它的主要功能如下。

(1)定義功能:完善的完整性控制機(jī)制應(yīng)該允許用戶定義各類完整性約束條件。

(2)檢查功能:用于檢查用戶發(fā)出的操作請求是否違背完整性約束條件。一般在向數(shù)據(jù)庫中輸入數(shù)據(jù)或者使用INSERT、DELETE或者UPDATE語句更新數(shù)據(jù)庫中數(shù)據(jù)時(shí)進(jìn)行檢查,也可以延遲到整個(gè)事務(wù)(強(qiáng)制成批執(zhí)行的一系列操作)執(zhí)行之后再進(jìn)行完整性檢查。例如,銀行數(shù)據(jù)庫中包含的“借貸總金額應(yīng)平衡”的約束就應(yīng)該是延遲執(zhí)行的約束。

(3)違約反應(yīng):即監(jiān)視數(shù)據(jù)操作的整個(gè)過程,如果發(fā)現(xiàn)用戶的操作請求使得數(shù)據(jù)違背完整性約束條件,則應(yīng)采用某些措施來保證數(shù)據(jù)的完整性。例如,可以拒絕執(zhí)行操作或者級(jí)聯(lián)執(zhí)行操作。

3.完整性規(guī)則

完整性子系統(tǒng)是根據(jù)“完整性規(guī)則集”工作的。完整性規(guī)則集是由DBA(數(shù)據(jù)庫管理員)或應(yīng)用程序員事先向完整性子系統(tǒng)提出的有關(guān)數(shù)據(jù)約束的一組規(guī)則。每個(gè)完整性規(guī)則由三個(gè)部分組成:

(1)什么時(shí)候使用規(guī)則進(jìn)行檢查,稱為規(guī)則的“觸發(fā)條件”。

(2)要檢查什么樣的錯(cuò)誤,稱為“約束條件”。

(3)如果檢查出錯(cuò)誤,則應(yīng)該怎樣處理,可在ELSE子句中說明。

4.RDBMS中的完整性規(guī)則

RDBMS中的完整性規(guī)則可分為三類。

(1)域完整性規(guī)則:用于保障基表中的列輸入有效。域完整性主要由用戶定義的完整性組成并通過合法性檢查來控制??刂朴蛲暾杂行У姆椒ㄓ邢拗茢?shù)據(jù)類型、格式、可能的取值范圍,強(qiáng)制修改列值時(shí)滿足一定的條件等。

(2)實(shí)體完整性規(guī)則:用于約束現(xiàn)實(shí)世界中的實(shí)體是可區(qū)分的,即它們具有唯一性標(biāo)識(shí)。這一規(guī)則在關(guān)系模型中的體現(xiàn)是基表中所有主屬性都不能取空值(NULL)。

(3)引用(參照)完整性規(guī)則:用于約束具有引用關(guān)系的兩個(gè)表中的主鍵和外鍵的數(shù)據(jù)要保持一致。在數(shù)據(jù)庫執(zhí)行引用完整性規(guī)則時(shí),保證同一數(shù)據(jù)在主表(被引用關(guān)系)和從表(引用關(guān)系)中的一致性,防止這些數(shù)據(jù)被用戶誤操作。

實(shí)現(xiàn)引用完整性時(shí),需要考慮多種問題,例如,外鍵是否接受空值;主表中刪除某行時(shí),從表中是否有相應(yīng)的元組;從表中插入行時(shí),主表中是否存在相關(guān)的行;修改主鍵值時(shí),從表中是否有對(duì)應(yīng)的外鍵值。5.2.1實(shí)體完整性控制

1.實(shí)體完整性定義

SQL語言中,實(shí)體完整性定義是通過CREATETABLE語句中的PRIMARYKEY關(guān)鍵字來定義的,也可以通過ALTERTABLE語句中的ADDPRIMARYKEY子句來修改。如果鍵中只有一個(gè)屬性,則既可定義為列級(jí)約束條件也可定義為表級(jí)約束條件;而當(dāng)鍵中包含多個(gè)屬性時(shí),就只能定義為表級(jí)約束條件了。5.2DBMS中的數(shù)據(jù)完整性

【例5-1】在“學(xué)生”表與“選課”表中定義主鍵。

將Student表中的Sno屬性定義為主鍵。

(1)列級(jí)定義“學(xué)生”表中的主鍵:

CREATETABLE學(xué)生(

學(xué)號(hào)CHAR(10)PRIMARYKEY,

姓名CHAR(20)NOTNULL,

性別CHAR(2),

年齡SMALLINT,

班級(jí)CHAR(4)

);

(2)表級(jí)“學(xué)生”表中的主鍵:

CREATETABLEStudent(

學(xué)號(hào)CHAR(10)PRIMARYKEY,

姓名CHAR(20)NOTNULL,

性別CHAR(2),

年齡SMALLINT,

班級(jí)CHAR(4),

PRIMARYKEY(學(xué)號(hào))

);

(3)將“選課”表中的(學(xué)號(hào)、課程號(hào))屬性組定義為主鍵:

CREATETABLEStudent(

學(xué)號(hào)CHAR(10)NOTNULL,

課程號(hào)CHAR(6)NOTNULL,

PRIMARYKEY(學(xué)號(hào),課程號(hào))

);

【例5-2】在“學(xué)生”表中添加主鍵約束和唯一值約束。

將學(xué)生表中的“學(xué)號(hào)”設(shè)置為主鍵的語句:

ALTERTABLE學(xué)生

ADDCONSTRAINTsID_pkprimarykey學(xué)號(hào)

為“姓名”字段添加唯一值約束的語句:

ALTERTABLE學(xué)生

ADDCONSTRAINTsName_ukUNIQUE姓名

2.實(shí)體完整性檢查和違約處理

在輸入或者修改數(shù)據(jù)時(shí),DBMS自動(dòng)按照實(shí)體完整性規(guī)則進(jìn)行檢查:

●檢查主鍵值是否唯一,如果不唯一則拒絕數(shù)據(jù)的輸入或者修改。

●檢查主鍵中包含的各個(gè)屬性值是否為空(NULL值),只要有一個(gè)為空就拒絕輸入或修改。

DBMS可以通過全表掃描來檢查記錄中主鍵值的唯一性。例如,在插入某條記錄時(shí),DBMS先從外存中讀取待查表的內(nèi)容并裝入內(nèi)存,然后將待插入記錄的主鍵值與表中所有記錄的主鍵值逐個(gè)比對(duì),如果發(fā)現(xiàn)了主鍵值相同的記錄,則阻止插入操作,如圖5-1所示。圖5-1全表掃描法檢查待插入記錄中主鍵值的唯一性5.2.2引用完整性的定義

1.創(chuàng)建表時(shí)定義外鍵約束

SQL語言中,可在通過CREATETABLE語句定義表時(shí)使用FOREIGNKEY子句定義外鍵(指定構(gòu)成外鍵的所有列名),并使用REFERENCES子句指定相應(yīng)主鍵所在的表。與實(shí)體完整性中主鍵的定義類似,外鍵的定義也有兩種方式:屬性級(jí)定義和關(guān)系級(jí)定義。創(chuàng)建表時(shí)定義外鍵約束的一般形式為

CREATETABLE表名(

字段名數(shù)據(jù)類型[FOREIGNKEY]

REFERNCES被引用表(被引用列)

[ONDELETE{CASCADE|NOACTION}]

[ONUPDATE{CASCADE|NOACTION}]

[字段名…]

);

【例5-3】在當(dāng)前數(shù)據(jù)庫中進(jìn)行以下數(shù)據(jù)定義:

●創(chuàng)建兩個(gè)主表“學(xué)生”表和“課程”表,其中主鍵分別為“學(xué)號(hào)”和“課號(hào)”。

●創(chuàng)建從表“選課”表,其中“學(xué)號(hào)”為對(duì)應(yīng)于“學(xué)生”表中主鍵的外鍵,“課號(hào)”為對(duì)應(yīng)于“課程”表中主鍵的外鍵。

●設(shè)置:當(dāng)主表“學(xué)生”表進(jìn)行更新或刪除操作時(shí),從表進(jìn)行級(jí)聯(lián)操作;當(dāng)主表“課程”表進(jìn)行更新或刪除操作時(shí),從表采用回滾方式。

(1)創(chuàng)建主表“學(xué)生”表,“學(xué)號(hào)”為主鍵:

CREATETABLE學(xué)生(

學(xué)號(hào)CHAR(10)PRIMARYKEY,

姓名CHAR(10)

…);

(2)創(chuàng)建主表“課程”表,“課號(hào)”為主鍵:

CREATETABLE課程(

課號(hào)CHAR(6)PRIMARYKEY,

課名CHAR(18)

…);

(3)創(chuàng)建從表“選課”表:

●設(shè)“學(xué)號(hào)”為外鍵,與“學(xué)生”表中主鍵對(duì)應(yīng),在對(duì)學(xué)生表進(jìn)行更新或刪除操作時(shí),當(dāng)前表進(jìn)行級(jí)聯(lián)操作。

●設(shè)“課號(hào)”為外鍵,與“課程”表主鍵對(duì)應(yīng),在對(duì)課程表進(jìn)行更新或刪除操作時(shí),當(dāng)前表采用回滾方式。

CREATETABLE選課(

學(xué)號(hào)CHAR(10)FOREIGNKEYREFERENCES學(xué)生(學(xué)號(hào))

ONDELETECASCADE

ONUPDATECASCADE,

課號(hào)CHAR(6)FOREIGNKEYREFERENCES課程(課號(hào))

ONDELETENOACTION

ONUPDATENOACTION,

分?jǐn)?shù)INT

);

2.通過修改表來定義外鍵約束

對(duì)于已經(jīng)存在的表,可以通過ALTERTABLE語句為其添加外鍵的定義,并使用REFERENCES子句指定被引用表(相應(yīng)主鍵所在的表)。為已有表添加外鍵約束的ALTERTABLE語句的一般形式為

ALTERTABLE表名

ADD[CONSTRAINT約束名]

[FOREIGNKEY](列名[,…])

REFERNCES被引用表(被引用列[,…])

[ONDELETE{CASCADE|NOACTION}]

[ONUPDATE{CASCADE|NOACTION}];

【例5-4】假定當(dāng)前數(shù)據(jù)庫中已有三個(gè)表:“學(xué)生”表、“課程”表和“選課”表。其中前兩個(gè)表的主鍵分別為“學(xué)號(hào)”和“課號(hào)”,將其作為主表;后一個(gè)表為從表,將其中“學(xué)號(hào)”定義為外鍵。

ALTERTABLE選課

ADDCONSTRAINTscFk

FOREIGNKEY學(xué)號(hào)REFERENCES學(xué)生(學(xué)號(hào));5.2.3引用完整性的檢查和違約處理

引用完整性屬于表與表之間的規(guī)則。如果兩個(gè)表之間建立了引用關(guān)系,則在一個(gè)表中插入、刪除或者更新記錄時(shí),就必須考慮另一個(gè)表中的數(shù)據(jù)是否匹配并在必要時(shí)進(jìn)行相應(yīng)的操作。如果只改其一不改其二,就會(huì)破壞數(shù)據(jù)的引用完整性。例如,以下幾種操作都可能破壞引用完整性:

●修改了主表中的主鍵而從表中的外鍵未做相應(yīng)改變。

●刪除了主表中某條記錄而從表中相應(yīng)記錄未刪除,使得這些記錄成為“孤立記錄”。

●在從表中插入了某條記錄,而主表中找不到主鍵與從表中外鍵等值的記錄。

可見,在單方面修改主表或從表時(shí),都應(yīng)該進(jìn)行相應(yīng)的檢查并進(jìn)行必要的違約處理。表5-1中列出了可能破壞引用完整性的幾種情況以及相應(yīng)的違約處理方法。表5-1可能破壞引用完整性的情況及違約處理方法

【例5-5】在被引用關(guān)系中刪除元組時(shí)的問題。

例如,想要?jiǎng)h除“學(xué)生”表中“學(xué)號(hào)=2012015122”的元組,而“選課”表中有5個(gè)元組的“學(xué)號(hào)=201215122”,則可采用以下幾種違約處理方法。

●級(jí)聯(lián)刪除:將“選課”表中所有5個(gè)“學(xué)號(hào)=2012015122”的元組一起刪除。如果引用表同時(shí)又是另一個(gè)表的被引用表,則這種刪除操作會(huì)繼續(xù)級(jí)聯(lián)進(jìn)行下去。

●受限刪除:系統(tǒng)將拒絕執(zhí)行這個(gè)刪除操作。

●置空值刪除:將“選課”表中所有“學(xué)號(hào)=2012015122”的元組的“學(xué)號(hào)”值置為空值。

【例5-6】在引用關(guān)系中插入元組時(shí)的問題。

例如,想在“選課”表中插入(2012015125,091211,91)元組,而“學(xué)生”表中找不到“學(xué)號(hào)=2012015125”的學(xué)生,則可采用以下幾種違約處理方法。

●受限插入:系統(tǒng)將拒絕向“選課”表中插入(2012015125,091211,91)元組。

●遞歸插入:系統(tǒng)將首先向“學(xué)生”表中插入“學(xué)號(hào)=2012015125”的元組,然后向“選課”表中插入(2012015125,091211,91)元組。

【例5-7】修改被引用關(guān)系中主鍵的問題。

如想要將“學(xué)生”表中“學(xué)號(hào)=2012015123”的元組中的“學(xué)號(hào)”改為2012015128,而“選課”表中有4個(gè)“學(xué)號(hào)=2012015123”的元組,則可采用以下幾種違約處理方法。

●級(jí)聯(lián)修改:將“選課”表中4個(gè)“學(xué)號(hào)=2012015123”的元組中的“學(xué)號(hào)”都改為2012015128。如果引用表同時(shí)又是另一個(gè)表的被引用表,則這種修改操作會(huì)繼續(xù)級(jí)聯(lián)進(jìn)行下去。

●受限修改:只有當(dāng)“選課”表中不存在“學(xué)號(hào)=2012015123”的元組時(shí),才能將“學(xué)生”表中的“學(xué)號(hào)=2012015123”的元組的“學(xué)號(hào)”改為2012015128?!裰每罩敌薷模簩ⅰ皩W(xué)生”表中“學(xué)號(hào)=2012015123”的元組的“學(xué)號(hào)”改為200215128,并將“選課”表中所有“學(xué)號(hào)=2012015123”的元組的“學(xué)號(hào)”置為空值。

在服務(wù)于“學(xué)生選課”任務(wù)的數(shù)據(jù)庫中,實(shí)際上只有第一種方法是可以采用的。

DBMS在實(shí)現(xiàn)引用完整性時(shí),需要向用戶提供:

(1)定義主鍵和外碼的機(jī)制;

(2)按照自己的應(yīng)用需求選擇處理依賴關(guān)系中對(duì)應(yīng)的元組的方法。5.2.4用戶定義的完整性

1.屬性上約束條件的定義

在使用CREATETABLE語句創(chuàng)建表時(shí),可以根據(jù)用戶需要定義屬性上的約束條件,包括以下幾種情況:

(1)列值非空,使用NOTNULL關(guān)鍵字。

(2)列值唯一,使用UNIQUE關(guān)鍵字。

(3)檢查列值是否滿足一個(gè)邏輯表達(dá)式,使用CHECK短語。

【例5-8】屬性上約束條件的定義。

(1)創(chuàng)建選課表,說明學(xué)號(hào)、課號(hào)和成績不能為空。

CREATETABLE選課(

學(xué)號(hào)CHAR(10)NOTNULL,

課號(hào)CHAR(6)NOTNULL,

成績SMALLINTNOTNULL,

PRIMARYKEY(學(xué)號(hào),課號(hào))

);

(2)創(chuàng)建“班級(jí)”表,要求“班級(jí)名”列取值唯一,“班號(hào)”列為主鍵。

CREATETABLE班級(jí)(

班號(hào)CHAR(6),

班級(jí)名CHAR(10)UNIQUE,

學(xué)院號(hào)CHAR(2),

PRIMARYKEY(班號(hào))

);

(3)創(chuàng)建“學(xué)生”表,要求“性別”列只允許取值為“男”或“女”。這時(shí)需要用CHECK短語指定列值應(yīng)該滿足的條件。

CREATETABLE學(xué)生(

學(xué)號(hào)CHAR(10)PRIMARYKEY,

姓名CHAR(10)NOTNULL,

性別CHAR(2)CHECK(性別IN('男','女')),

年齡SMALLINT,

班號(hào)CHAR(6)

);

2.元組上約束條件的定義

【例5-9】創(chuàng)建學(xué)生表時(shí),限制男生的名字中前兩個(gè)字符不能是“女-”。

CREATETABLEStudent(

學(xué)號(hào)CHAR(10),

姓名CHAR(10)NOTNULL,

性別CHAR(2),

年齡SMALLINT,

班號(hào)CHAR(6),

PRIMARYKEY(學(xué)號(hào)),

CHECK(性別='女'OR姓名NOTLIKE'女-%')

);5.2.5完整性約束的命名與修改

1.完整性約束命名子句

SQL99標(biāo)準(zhǔn)允許在CREATETABLE語句中使用CONSTRAINT完整性約束命名子句,用來對(duì)完整性約束命名。從而靈活地添加或刪除完整性約束條件。CONSTRAINT約束命名子句的一般形式為

CONSTRAINT<完整性約束條件名>

[ PRIMARYKEY短語

|FOREIGNKEY短語

|CHECK短語]

【例5-10】創(chuàng)建“學(xué)生”表,同時(shí)指定學(xué)號(hào)在“20120101”~“20120125”之間,姓名不能為空,年齡小于30,性別只能是“男”或“女”。

CREATETABLE學(xué)生(

學(xué)號(hào)CHAR(10)CONSTRAINTcID

CHECK(學(xué)號(hào)BETWEEN'20120101'AND'20120125'),

姓名CHAR(10)CONSTRAINTcNameNOTNULL,

年齡SMALLINTCONSTRAINTcAgeCHECK(年齡<30),

性別CHAR(2)CONSTRAINTcSexCHECK(性別IN('男','女')),

CONSTRAINTkeyStuPRIMARYKEY(學(xué)號(hào))

);

【例5-11】創(chuàng)建“工資”表,同時(shí)設(shè)置每個(gè)教師的應(yīng)發(fā)工資不低于3600元。

CREATE教工(

工號(hào)CHAR(6)PRIMARYKEY,

姓名CHAR(10),

職業(yè)CHAR(8),

實(shí)發(fā)NUMERIC(7,2),

扣除NUMERIC(7,2),

單位號(hào)CHAR(2),

CONSTRAINTkeyEmpFOREIGNKEY(單位號(hào))REFERENCES單位(單位號(hào)),

CONSTRAINTcPayCHECK(實(shí)發(fā)+扣除>=3600)

);

2.修改表中的完整性約束

可以在使用ALTERTABLE語句修改表的結(jié)構(gòu)時(shí)修改表中的完整性約束。

【例5-12】修改表結(jié)構(gòu)時(shí)修改完整性約束。

(1)去掉“學(xué)生”表中“性別”列的約束:

ALTERTABLE

DROPCONSTRAINTcSex;

(2)修改“學(xué)生”表中的約束條件,將“學(xué)號(hào)”改為“20120101”~“20120150”,“年齡”由小于30改為小于40。

可以先刪除原來的約束條件:

ALTERTABLE學(xué)生

DROPCONSTRAINTcID;

再增加新的約束條件:

ALTERTABLE學(xué)生

ADDCONSTRAINTcIDCHECK(學(xué)號(hào)BETWEEN'20120101'AND'20120150');觸發(fā)器是強(qiáng)制執(zhí)行特定操作的語句(或程序),每當(dāng)發(fā)生了施加于觸發(fā)器所保護(hù)的數(shù)據(jù)之上的修改(插入、刪除、更新)操作時(shí),它就會(huì)自動(dòng)執(zhí)行(觸發(fā))。觸發(fā)器是一種可以確保數(shù)據(jù)庫中數(shù)據(jù)一致性的重要數(shù)據(jù)庫對(duì)象。與CHECK約束相比,觸發(fā)器可以強(qiáng)制實(shí)現(xiàn)更為復(fù)雜、更為精細(xì)的數(shù)據(jù)完整性約束,可以執(zhí)行多個(gè)操作或級(jí)聯(lián)操作,可以實(shí)現(xiàn)多個(gè)元組之間的完整性約束,可按其定義動(dòng)態(tài)地、實(shí)時(shí)地維護(hù)相關(guān)的數(shù)據(jù)。觸發(fā)器至少具有以下優(yōu)點(diǎn):5.3觸發(fā)器

(1)可在寫入數(shù)據(jù)表之前,強(qiáng)制檢驗(yàn)或轉(zhuǎn)換數(shù)據(jù)。

(2)在觸發(fā)程序發(fā)生錯(cuò)誤時(shí),異常操作的結(jié)果會(huì)被撤銷。

(3)部分DBMS可以針對(duì)數(shù)據(jù)定義語言使用觸發(fā)程序(稱為DDL觸發(fā)器)。

(4)可依照特定的情況,替換異常操作的命令(INSTEADOF)。

如果將對(duì)于表中數(shù)據(jù)修改操作看做數(shù)據(jù)修改事件,那么,觸發(fā)器就是由數(shù)據(jù)修改事件觸發(fā)執(zhí)行的維護(hù)數(shù)據(jù)的程序。一般來說,數(shù)據(jù)的修改操作有插入、刪除和更新三種,因而觸發(fā)器也可分為INSERT、UPDATE和DELETE三種類型。5.3.1定義觸發(fā)器

一個(gè)觸發(fā)器由三部分組成:事件、條件和動(dòng)作。

“事件”是指施加于數(shù)據(jù)庫中數(shù)據(jù)之上的插入、刪除或者更新操作,如果定義觸發(fā)器時(shí)指定的事件發(fā)生,則觸發(fā)器自動(dòng)開始工作。當(dāng)觸發(fā)器被事件激活時(shí),將會(huì)測試觸發(fā)“條件”是否成立,如果條件成立,才會(huì)執(zhí)行相應(yīng)的“動(dòng)作”。觸發(fā)器的動(dòng)作可以是一系列數(shù)據(jù)庫中數(shù)據(jù)的操作,也可以是阻止事件發(fā)生的動(dòng)作(撤銷事件,如刪除剛插入的元組等),還可以是與觸發(fā)事件毫無關(guān)聯(lián)的其他操作。定義觸發(fā)器的CREATETRIGGER語句的一般形式為

CREATETRIGGER<觸發(fā)器名>ON{<表名>|<視圖名>}

{FOR|AFTER|INSTEADOF}<INSERT|DELETE|UPDATE>

AS

<SQL語句>;

注:不同DBMS定義觸發(fā)器的語句格式有所不同,這里采用SQLServer的DML格式。DML觸發(fā)器是當(dāng)數(shù)據(jù)庫服務(wù)器中發(fā)生數(shù)據(jù)操縱語言(DML)事件時(shí)所要執(zhí)行的操作。其中幾個(gè)參數(shù)的意義如下:

(1)“觸發(fā)器名”在數(shù)據(jù)庫中必須是唯一的。

(2)“表名”為觸發(fā)器的目標(biāo)表(也可以是視圖)。

(3)在SQLServer中,可以創(chuàng)建“后觸發(fā)”和“替代觸發(fā)”兩種方式的觸發(fā)器。

后觸發(fā)方式是在觸發(fā)操作(INSERT、DELETE或UPDATA)執(zhí)行完成且處理過所有約束后激活觸發(fā)器。如果觸發(fā)操作違反約束條件,將導(dǎo)致事務(wù)回滾,這時(shí)就不會(huì)執(zhí)行后觸發(fā)器了。后觸發(fā)器用“AFTER”指定,只能用于表而不能用于視圖,觸發(fā)執(zhí)行后如果發(fā)現(xiàn)錯(cuò)誤,可以用ROLLBACKTRANSACTION語句來回滾本次操作。注:事務(wù)是數(shù)據(jù)庫更新操作的基本單位。一個(gè)事務(wù)中包含一系列必須完全執(zhí)行的數(shù)據(jù)庫操作,如果一個(gè)事務(wù)啟動(dòng)執(zhí)行后出現(xiàn)問題而使得其中某些操作無法執(zhí)行,則必須撤銷已經(jīng)執(zhí)行的那些操作,回復(fù)到該事務(wù)啟動(dòng)執(zhí)行之前的狀態(tài),稱為事務(wù)回滾。

替代觸發(fā)方式是當(dāng)觸發(fā)操作發(fā)生時(shí),DBMS停止執(zhí)行觸發(fā)操作(引起觸發(fā)器執(zhí)行的SQL語句)轉(zhuǎn)去執(zhí)行這個(gè)替代觸發(fā)器。替代觸發(fā)器用“AFTER”指定,不僅可以定義在表上,也可以定義在視圖上,用于擴(kuò)展視圖所支持的更新操作。

(4)DML事件可以是INSERT、DELETE或UPDATE操作中的某一個(gè),也可以是幾個(gè)事件的組合。一個(gè)表或視圖的每個(gè)修改動(dòng)作(INSERT、DELETE或UPDATE)都可以有一個(gè)INSTEADOF觸發(fā)器﹐一個(gè)表的每個(gè)修改動(dòng)作都可以有多個(gè)AFTER觸發(fā)器。

(5)觸發(fā)動(dòng)作的執(zhí)行體為一段SQL語句塊,如果該觸發(fā)執(zhí)行體執(zhí)行失敗,則激活觸發(fā)器的事件就會(huì)終止,觸發(fā)器的目標(biāo)表或觸發(fā)器可能影響的其他表不會(huì)有任何變化(執(zhí)行事務(wù)的回滾操作)。

【例5-13】通過觸發(fā)器完善刪除操作。

(1)保存被刪除的數(shù)據(jù)。

假定數(shù)據(jù)庫中有一個(gè)備用的“學(xué)生_暫存”表,表的結(jié)構(gòu)與“學(xué)生”表相同。為“學(xué)生”表創(chuàng)建一個(gè)觸發(fā)器,當(dāng)刪除“學(xué)生”表中的記錄時(shí),將被刪記錄保存到“學(xué)生_暫存”表中。

CREATETRIGGERsaveDeleteON學(xué)生

AFTERDELETE

AS

INSERTINTO學(xué)生_暫存

(SELECT*FROMdeleted);

(2)實(shí)現(xiàn)級(jí)聯(lián)刪除。

刪除“學(xué)生”表中某個(gè)學(xué)生的記錄之后,自動(dòng)從“選課”表中刪除該生的選課記錄。

CREATETRIGGERcascadingDeleteON學(xué)生

AFTERDELETE

AS

DELETEFROM選課

WHERE學(xué)號(hào)IN

(SELECT學(xué)號(hào)FROMdeleted);

【例5-14】在“學(xué)生”表上創(chuàng)建一個(gè)INSERT觸發(fā)器,實(shí)現(xiàn)當(dāng)在“學(xué)生”表中插入一名學(xué)生時(shí),自動(dòng)調(diào)整“班級(jí)”表中的相應(yīng)數(shù)據(jù)(假定“班級(jí)”表中有“人數(shù)”字段),從而保持?jǐn)?shù)據(jù)一致性。

CREATETRIGGERinsStuTrigON學(xué)生

FORINSERT

ASbegin

declare@sClassCHAR(10)

SELECT@sClass=班名FROMinserted

Ifnotexists(SELECT班名,人數(shù)FROM班級(jí)WHERE班名=@sClass)

INSERTINTO班級(jí)(班名,人數(shù))VALUES(@sClass,1)

else

UPDATE班級(jí)SET人數(shù)=人數(shù)+1WHERE班級(jí)名=@sClass

end;5.3.2觸發(fā)器的使用

觸發(fā)器中可以包含復(fù)雜的SQL語句,主要用于強(qiáng)制服從復(fù)雜的業(yè)務(wù)規(guī)則或要求。觸發(fā)器的應(yīng)用多種多樣。一般來說,可用于以下幾個(gè)方面:

(1)在數(shù)據(jù)寫入關(guān)系表之前,進(jìn)行強(qiáng)制約束檢查或數(shù)據(jù)轉(zhuǎn)換,以維護(hù)數(shù)據(jù)完整性。

(2)用于示警,當(dāng)觸發(fā)程序發(fā)生錯(cuò)誤時(shí),執(zhí)行結(jié)果會(huì)被撤銷。

(3)用于滿足特定條件時(shí)自動(dòng)執(zhí)行某項(xiàng)任務(wù)。

1.觸發(fā)器的作用

觸發(fā)器常用于保證數(shù)據(jù)完整性,并在一定程度上實(shí)現(xiàn)數(shù)據(jù)的完全性。例如,可以使用觸發(fā)器來進(jìn)行審計(jì)。

【例5-15】創(chuàng)建觸發(fā)器,使得只有數(shù)據(jù)庫的擁有者才能修改“選課”表中的成績,其他用戶對(duì)該表的插入、刪除或修改操作都要登記。

本例中,需要先創(chuàng)建一個(gè)審計(jì)表,用于登記用戶操作情況,然后分別創(chuàng)建三個(gè)觸發(fā)器,將反映用戶操作情況的記錄插入審計(jì)表。

(1)創(chuàng)建用于登記用戶操作情況的表:

CREATETABLE操作登記(

用戶號(hào)CHAR(10)NOTNULL,

操作日期DATETIMENOTNULL,

操作種類CHAR(6)NOTNULL,

CONSTRAINTtracePKPRIMARYKEY(用戶號(hào),操作日期)

);

(2)創(chuàng)建插入觸發(fā)器:

CREATETRIGGERinsertTraceON選課

FORINSERT

AS

IFEXISTS( SELECT*FROMinserted)

INSERTINTO操作登記VALUES(user,gerdate(),'插入');

(3)創(chuàng)建刪除觸發(fā)器:

CREATETRIGGERdeleteTraceON選課

FORDELETE

AS

IFEXISTS( SELECT*FROMdeleted

INSERTINTO操作登記VALUES(user,gerdate(),'刪除');

(4)創(chuàng)建更新觸發(fā)器:

CREATETRIGGERupdateTraceON選課

FORUPDATE

AS

IFEXISTS( SELECT*FROMdeleted)begin

IFuser!='dbo'

ROLLBACK

ELSE

INSERTINTO操作登記VALUES(user,gerdate(),'插入')

end;

2.后觸發(fā)器的執(zhí)行

三種后觸發(fā)器的執(zhí)行過程如下。

(1)?INSERT觸發(fā)器的執(zhí)行過程:先在INSERT觸發(fā)器所屬的表上執(zhí)行INSERT語句,同時(shí)將該語句中插入的記錄送入inserted表,然后啟動(dòng)INSERT觸發(fā)器并執(zhí)行其中的操作。

(2)?DELETE觸發(fā)器的執(zhí)行過程:先在DELETE觸發(fā)器所屬的表上執(zhí)行DELETE語句,再將該語句中刪除的記錄送入deleted表,然后啟動(dòng)DELETE觸發(fā)器并執(zhí)行其中的操作。

(3)?UPDATE語句可以看做兩個(gè)步驟:DELETE操作捕獲數(shù)據(jù)的前像,INSERT操作捕獲數(shù)據(jù)的后像。當(dāng)在觸發(fā)器所屬的表上執(zhí)行UPDATE語句時(shí),原記錄(前像)送入deleted表,而更新的記錄(后像)插入inserted表。觸發(fā)器可以檢索deleted表和inserted表來確定是否更新了多條記錄以及如何執(zhí)行觸發(fā)器動(dòng)作。

3.替代型觸發(fā)器

替代型觸發(fā)器用于替代激活了它的動(dòng)作(事件)本身??梢栽诒砗鸵晥D上定義替代型觸發(fā)器,每個(gè)表上對(duì)于每個(gè)觸發(fā)動(dòng)作只能定義一個(gè)這類觸發(fā)器。替代型觸發(fā)器是在inserted表和deleted表剛建立而其他操作(完整性約束或其他動(dòng)作)還沒有發(fā)生之前執(zhí)行的。

替代型觸發(fā)器使得一般不支持更新的視圖也能得到更新。它截獲對(duì)于視圖的操作,將其重導(dǎo)向底層的表。在替代型觸發(fā)器中,通過deleted表訪問待刪除的行;在INSTEADOFUPDATE或者INSTEADOFINSERT觸發(fā)器中,通過inserted表訪問新添加的行。

【例5-16】假定有兩個(gè)分別存放理學(xué)院學(xué)生和工學(xué)院學(xué)生基本信息的表,即“理學(xué)生”和“工學(xué)生”,其關(guān)系模式相同:

理學(xué)生(學(xué)號(hào),姓名,性別,學(xué)院,生日,電話)

工學(xué)生(學(xué)號(hào),姓名,性別,學(xué)院,生日,電話)

要求創(chuàng)建由兩個(gè)表聯(lián)合查詢而得到的視圖,再為其創(chuàng)建一個(gè)替代型觸發(fā)器,當(dāng)在視圖上更新某個(gè)學(xué)生的電話號(hào)碼時(shí),按其所屬學(xué)院而分別重導(dǎo)向更新“理學(xué)生”表或“工學(xué)

生”表。

(1)創(chuàng)建“理學(xué)生”表或“工學(xué)生”表聯(lián)合查詢而得到的視圖:

CREATEVIEWstudentView

AS

SELECT*FROM理學(xué)生

UNION

SELECT*FROM工學(xué)生;

(2)創(chuàng)建studentView視圖上的替代型觸發(fā)器:

CREATETRIGGERstuUpdate

ONStudentView

INSTEADOFUPDATE

AS

DECLARE@stuDeptvarchar(15)

SET@dept=(SELECT學(xué)院FROMinserted)

IF@dept='理'begin

UPDATE理學(xué)生SET理學(xué)生.電話=Inserted.電話

FROM理學(xué)生.JOINInsertedON理學(xué)生.學(xué)號(hào)=Inserted.學(xué)號(hào)end

ELSEIF@dept='工'begin

UPDATE工學(xué)生

SET工學(xué)生.電話=Inserted.電話

FROM工學(xué)生JOINInsertedON工學(xué)生.學(xué)號(hào)=Inserted.學(xué)號(hào)

end;

4.修改觸發(fā)器

可以對(duì)已有的觸發(fā)器進(jìn)行修改。修改觸發(fā)器的ALTERTRIGGER語句的一般形式為

ALTERTRIGGER觸發(fā)器名

ON{<表名>|<視圖名>}

{FOR|AFTER|INSTEADOF}[INSERT,DELETE,UPDATE]

AS

<SQL語句>;

5.刪除觸發(fā)器

刪除觸發(fā)器的DROPTRIGGER語句的一般形式為

DROPTRIGGER<觸發(fā)器名>ON<表名>;

待刪除的觸發(fā)器必須已經(jīng)存在,并且只能由具有相應(yīng)權(quán)限的用戶刪除。例如,刪除“教師”表上的觸發(fā)器insertSal的語句為

DROPTRIGGERinsertSalONTeacher;

6.禁用/啟用觸發(fā)器

禁用或者啟用已有觸發(fā)器的語句的一般形式為

ALTERTABLE<表名>

{ENABLE|DISABLE}TRIGGER<觸發(fā)器名>;

其中,ENABLE選項(xiàng)為啟用觸發(fā)器,DISABLE選項(xiàng)為禁用觸發(fā)器。5.4.1數(shù)據(jù)庫安全的概念

數(shù)據(jù)庫安全涉及數(shù)據(jù)庫技術(shù)之外的防盜、防災(zāi)、防破壞以及人員分級(jí)與審查等各個(gè)方面,這些都是保障數(shù)據(jù)庫安全所必不可少的措施。從數(shù)據(jù)庫技術(shù)角度上看,數(shù)據(jù)庫系統(tǒng)的安全特性主要是針對(duì)其中存儲(chǔ)的數(shù)據(jù)而言的,可將其歸結(jié)為數(shù)據(jù)獨(dú)立性、數(shù)據(jù)安全性、數(shù)據(jù)完整性、并發(fā)控制和故障恢復(fù)等幾個(gè)方面。這些內(nèi)容中,有的(如數(shù)據(jù)完整性)已經(jīng)討論過了,有的(如并發(fā)控制和故障恢復(fù))將在后面的章節(jié)中介紹,這里主要討論數(shù)據(jù)庫系統(tǒng)級(jí)的數(shù)據(jù)安全性問題。5.4數(shù)據(jù)庫安全性控制

1.?dāng)?shù)據(jù)安全性控制方式

數(shù)據(jù)庫安全性控制方式可分為兩類:物理處理方式和系統(tǒng)處理方式。

物理處理方式是指針對(duì)口令泄漏、竊聽通信線路以及盜竊物理存儲(chǔ)設(shè)備等行為,采取數(shù)據(jù)加密、強(qiáng)化警戒等措施,達(dá)到保護(hù)數(shù)據(jù)庫中數(shù)據(jù)的目的。

系統(tǒng)處理方式是指數(shù)據(jù)庫系統(tǒng)的處理方式。數(shù)據(jù)庫系統(tǒng)往往需要設(shè)置多種不同層次、不同方式的安全措施來保證自身的安全:當(dāng)某個(gè)用戶試圖訪問數(shù)據(jù)庫時(shí),數(shù)據(jù)庫系統(tǒng)會(huì)根據(jù)他輸入的用戶標(biāo)志進(jìn)行用戶身份驗(yàn)證,并在確認(rèn)為合法用戶后準(zhǔn)許他進(jìn)入計(jì)算機(jī)系統(tǒng);當(dāng)合法用戶進(jìn)入系統(tǒng)后,數(shù)據(jù)庫系統(tǒng)還要對(duì)他進(jìn)行權(quán)限控制,即從技術(shù)上限制他只能在所得授權(quán)范圍內(nèi)進(jìn)行數(shù)據(jù)訪問;為了進(jìn)一步防范對(duì)于數(shù)據(jù)的非法查詢和使用,還可以對(duì)數(shù)據(jù)庫中的數(shù)據(jù)進(jìn)行加密;為了確保數(shù)據(jù)庫的安全,還要對(duì)數(shù)據(jù)庫進(jìn)行實(shí)時(shí)或定時(shí)備份,以保證數(shù)據(jù)在遭受災(zāi)難性損毀后能夠恢復(fù)。

2.安全性級(jí)別

一般來說,數(shù)據(jù)庫保護(hù)的不同安全級(jí)別以及相應(yīng)的安全措施如下。

(1)環(huán)境級(jí):對(duì)計(jì)算機(jī)機(jī)房和設(shè)備加以保護(hù),防止物理破壞。

(2)用戶級(jí):對(duì)數(shù)據(jù)庫系統(tǒng)工作人員加強(qiáng)勞動(dòng)紀(jì)律和職業(yè)道德教育,并授予不同職員不同的數(shù)據(jù)庫訪問權(quán)限。

(3)操作系統(tǒng)級(jí):防止未經(jīng)授權(quán)用戶從操作系統(tǒng)層入手訪問數(shù)據(jù)庫。

(4)網(wǎng)絡(luò)級(jí):目前,常用的數(shù)據(jù)庫系統(tǒng)都允許用戶通過網(wǎng)絡(luò)訪問,因此,網(wǎng)絡(luò)軟件內(nèi)部的安全性對(duì)于數(shù)據(jù)庫的安全是很重要的。

(5)數(shù)據(jù)庫系統(tǒng)級(jí):數(shù)據(jù)庫根據(jù)預(yù)先定義好的用戶權(quán)限進(jìn)行存取控制,檢驗(yàn)用戶的身份是否合法以及訪問的是否許可范圍內(nèi)的數(shù)據(jù)。

3.?dāng)?shù)據(jù)庫訪問的權(quán)限問題

數(shù)據(jù)庫中的數(shù)據(jù)要為所有相關(guān)用戶所共享,但絕大多數(shù)用戶往往只需要使用且只能使用與自己業(yè)務(wù)相關(guān)聯(lián)的一部分?jǐn)?shù)據(jù),因而,DBMS需要通過相應(yīng)的技術(shù)手段來控制不同用戶訪問不同范圍內(nèi)的數(shù)據(jù)。例如,假定有一個(gè)名為“選修課管理”的數(shù)據(jù)庫系統(tǒng),其主要用戶包括教務(wù)員、教師和學(xué)生三類人員。學(xué)生需要選課或查看成績;教師需要查看課表、選課學(xué)生名單并登記學(xué)生成績;教務(wù)員需要錄入課表、查看或修改選課學(xué)生名單、查看或更新學(xué)生成績。在這個(gè)數(shù)據(jù)庫系統(tǒng)中,應(yīng)該為教務(wù)員、教師和學(xué)生分別設(shè)置不同的權(quán)限,使得不同種類的用戶能夠訪問他們需要的數(shù)據(jù)并限制他們的越權(quán)訪問。非法或者越權(quán)使用數(shù)據(jù)庫中數(shù)據(jù)的行為往往是有意的,例如:

(1)某個(gè)人可能會(huì)自編一段合法的程序,繞過DBMS及其授權(quán)機(jī)制,通過操作系統(tǒng)直接存取、修改或備份數(shù)據(jù)庫中的數(shù)據(jù)。

(2)合法用戶可能會(huì)在進(jìn)入數(shù)據(jù)庫系統(tǒng)后執(zhí)行非授權(quán)操作,甚至可能會(huì)編寫應(yīng)用程序來執(zhí)行越權(quán)的數(shù)據(jù)訪問操作。

(3)某個(gè)用戶可能會(huì)通過多次合法查詢數(shù)據(jù)庫中的數(shù)據(jù)而從中推導(dǎo)出一些保密數(shù)據(jù)。例如,如果選修課管理數(shù)據(jù)庫不允許一個(gè)學(xué)生查詢另一個(gè)學(xué)生的成績,但卻允許查詢?nèi)我庖唤M人的平均成績,而某個(gè)學(xué)生想查詢“張京”的成績,他可以先查詢包括張京在內(nèi)的一組學(xué)生的平均成績,再用自己替換張京并再次查詢這一組的平均成績,然后推算出張京的成績。5.4.2數(shù)據(jù)庫安全控制的方法

1.用戶標(biāo)識(shí)與鑒別

用戶標(biāo)識(shí)和鑒別是DBMS提供的最外層保護(hù)措施。用戶每次登錄數(shù)據(jù)庫時(shí),都要輸入用戶標(biāo)識(shí),DBMS進(jìn)行核對(duì)并給予合法用戶進(jìn)入系統(tǒng)最外層的權(quán)限。用戶標(biāo)識(shí)和鑒別的方法很多,常用的方法如下。

(1)身份認(rèn)證:用戶的身份(也稱為用戶標(biāo)識(shí)、用戶賬號(hào)、用戶ID)由用戶名來唯一標(biāo)識(shí)。用戶名由系統(tǒng)管理員為用戶定義并記錄在計(jì)算機(jī)系統(tǒng)或DBMS中,一般不允許用戶自行修改。身份認(rèn)證是指系統(tǒng)將輸入的用戶名與合法用戶名對(duì)照,鑒別是否為合法用戶。如果通過了鑒別,則可進(jìn)行下一步核實(shí);否則拒絕使用系統(tǒng)。

(2)口令認(rèn)證:用戶的口令是合法用戶自定義并可按需要變更的密碼??诹钣涗浽跀?shù)據(jù)庫中,可以看做用戶私有的鑰匙??诹钫J(rèn)證是對(duì)于用戶的進(jìn)一步核實(shí)。一般地,用戶按系統(tǒng)的提示輸入口令,輸入正確口令后才能進(jìn)入系統(tǒng)。為保密起見,用戶輸入的口令內(nèi)容在屏幕上用特定字符(“*”或“●”等)替代。

(3)隨機(jī)數(shù)運(yùn)算認(rèn)證:隨機(jī)數(shù)認(rèn)證實(shí)際上是非固定口令的認(rèn)證,鑒別時(shí),系統(tǒng)提供一個(gè)隨機(jī)數(shù),由用戶按照預(yù)先約定的計(jì)算過程或計(jì)算函數(shù)進(jìn)行計(jì)算并將結(jié)果輸入系統(tǒng),再由系統(tǒng)判定是否合法用戶。例如,可以約定算法為“口令=隨機(jī)數(shù)平方的后三位”,則當(dāng)系統(tǒng)提供的隨機(jī)數(shù)為96時(shí),用戶應(yīng)該輸入的口令是216。

2.存取控制(授權(quán)機(jī)制)

對(duì)于通過了用戶標(biāo)識(shí)鑒別的用戶,還要由DBMS進(jìn)一步識(shí)別和鑒定以確定該用戶是否具有數(shù)據(jù)庫的使用權(quán),從而防止非法用戶對(duì)數(shù)據(jù)庫進(jìn)行存取操作。DBMS的存取控制機(jī)制用于確保具有數(shù)據(jù)庫使用權(quán)限的用戶訪問數(shù)據(jù)庫并進(jìn)行權(quán)限范圍內(nèi)的操作,同時(shí)使得未授權(quán)用戶無法接近數(shù)據(jù)。

(1)存取機(jī)制的構(gòu)成。存取控制機(jī)制主要包括兩部分。

一是定義用戶權(quán)限,用戶權(quán)限是指允許用戶施加于數(shù)據(jù)對(duì)象上的操作種類。用戶權(quán)限由具有授權(quán)資格的用戶使用DBMS提供的DCL(數(shù)據(jù)控制語言)來定義(描述授權(quán)決定)。其中包括將哪些數(shù)據(jù)對(duì)象的哪些操作權(quán)限授予哪些用戶這樣的授權(quán)描述,計(jì)算機(jī)分析授權(quán)描述,并將編譯后的授權(quán)描述存放在數(shù)據(jù)字典中。從而完成對(duì)于用戶權(quán)限的定義和登記。

二是進(jìn)行權(quán)限檢查,每當(dāng)用戶發(fā)出存取數(shù)據(jù)庫的操作請求時(shí),DBMS查找數(shù)據(jù)字典并進(jìn)行合法權(quán)限檢查。如果用戶的操作請求并未超出其數(shù)據(jù)操作權(quán)限,則準(zhǔn)予執(zhí)行;否則拒絕執(zhí)行該操作。

(2)存取機(jī)制的類別。當(dāng)前網(wǎng)絡(luò)版的DBMS一般都支持自主存取控制,有些大型DBMS還支持強(qiáng)制存取控制(MAC)。在自主存取控制方法中,用戶對(duì)于不同的數(shù)據(jù)對(duì)象可以有不同的存取權(quán)限,不同的用戶對(duì)同一數(shù)據(jù)對(duì)象的存取權(quán)限也可各不相同,一個(gè)用戶還可以將自己擁有的存取權(quán)限轉(zhuǎn)授給其他用戶。

在強(qiáng)制存取控制方法中,每個(gè)數(shù)據(jù)對(duì)象被標(biāo)以一定的密級(jí);每個(gè)用戶也被授予某一級(jí)別的許可證。對(duì)于任意一個(gè)對(duì)象,只有具有合法許可證的用戶才可以存取。

顯然,自主存取控制比較靈活,強(qiáng)制存取控制比較嚴(yán)格。

3.視圖機(jī)制

進(jìn)行存取權(quán)限控制時(shí),還可以通過定義用戶的外模式來提供一定的安全保護(hù)功能。也就是說,可以為不同的用戶定義不同的視圖,通過視圖機(jī)制屏蔽需要保密的數(shù)據(jù),使得那些無權(quán)訪問的用戶無法接觸這些數(shù)據(jù)。另外,還可以將視圖機(jī)制與授權(quán)機(jī)制結(jié)合起來,即在視圖上進(jìn)一步定義存取權(quán)限,將對(duì)于數(shù)據(jù)對(duì)象的訪問限制在更為安全的范圍之內(nèi)。

視圖機(jī)制使得系統(tǒng)具有一定程度的數(shù)據(jù)安全性、數(shù)據(jù)的邏輯獨(dú)立性和操作簡便等優(yōu)點(diǎn)。但視圖機(jī)制的安全保護(hù)功能不夠精細(xì),往往遠(yuǎn)不能滿足應(yīng)用系統(tǒng)的實(shí)際需求。實(shí)際上,視圖機(jī)制更主要的功能在于提供數(shù)據(jù)獨(dú)立性。

4.審計(jì)方法

審計(jì)功能是一種預(yù)防監(jiān)測手段,它可自動(dòng)記錄用戶在數(shù)據(jù)庫上的所有操作并放入審計(jì)日志中,一旦出現(xiàn)非法存取數(shù)據(jù)的情況,DBA可以利用審計(jì)跟蹤的信息,重現(xiàn)導(dǎo)致數(shù)據(jù)庫現(xiàn)有狀況的一系列事件,找出非法存取數(shù)據(jù)的人、時(shí)間和內(nèi)容等。

任何系統(tǒng)的安全保護(hù)措施都不大可能是無懈可擊的,蓄意盜竊、破壞數(shù)據(jù)的人常會(huì)想方設(shè)法打破控制,因此,審計(jì)功能在維護(hù)數(shù)據(jù)安全、打擊犯罪方面是非常有效的。但審計(jì)通常會(huì)花費(fèi)較多的時(shí)間和空間,因此DBA要根據(jù)實(shí)際應(yīng)用對(duì)于安全性的需求,靈活打開或關(guān)閉審計(jì)功能。

5.?dāng)?shù)據(jù)加密

對(duì)于高度敏感性數(shù)據(jù),如財(cái)務(wù)數(shù)據(jù)、軍事數(shù)據(jù)以及國家機(jī)密等,除采取以上安全性措施外,還應(yīng)該進(jìn)行數(shù)據(jù)加密。

數(shù)據(jù)加密是防止數(shù)據(jù)在存儲(chǔ)和傳輸過程中失密的有效手段。加密的基本思想是:根據(jù)一定的算法,將原始數(shù)據(jù)(稱為明文)變換為不可直接識(shí)別的格式(稱為密文),從而使得不明白解密算法的人無法獲得數(shù)據(jù)的內(nèi)容。加密方法主要有兩種:一是替換方法,即使用密鑰將明文中的每一個(gè)字符轉(zhuǎn)換為密文中的字符;二是置換方法,僅將明文的字符按不同的順序重新排列。單獨(dú)使用某一種方法都是不夠安全的,但將這兩種方法結(jié)合起來就能達(dá)到相當(dāng)高的安全程度。

6.統(tǒng)計(jì)數(shù)據(jù)庫的安全

有時(shí)候只允許某些人訪問數(shù)據(jù)庫中的統(tǒng)計(jì)數(shù)據(jù)而不能訪問個(gè)別數(shù)據(jù),因此有些專門管理統(tǒng)計(jì)數(shù)據(jù)的數(shù)據(jù)庫系統(tǒng)(如人口統(tǒng)計(jì)數(shù)據(jù)庫),其中包含大量數(shù)據(jù)記錄,其目的是向用戶提供各種統(tǒng)計(jì)匯總信息而不是提供單個(gè)記錄的信息。這種數(shù)據(jù)庫系統(tǒng)存在特殊的安全問題:有些人能夠找到隱蔽的信息通道,使得通過合法的查詢能夠得到不合法的信息。

【例5-17】通過合法查詢推導(dǎo)出不合法信息的情況及其預(yù)防措施。

(1)允許查詢“程序員的平均工資?”而不允許查詢“高級(jí)程序員王英的工資?”,但可以通過下面合法的查詢推導(dǎo)出不合法的信息:

●本公司共有多少個(gè)高級(jí)女程序員?

●本公司高級(jí)女程序員的工資總額是多少?

如果第一個(gè)查詢的結(jié)果是1,那么第二個(gè)查詢的結(jié)果就是這個(gè)程序員的工資。為了堵塞這種漏洞,可以制定規(guī)則:

規(guī)則1任何查詢至少要涉及N(N足夠大)條以上的記錄。

(2)用戶“李鐵”發(fā)出下面兩個(gè)合法查詢:

●用戶“李鐵”和其他N個(gè)程序員的工資總額是多少?

●用戶“張群”和其他N個(gè)程序員的工資總額是多少?

如果第一個(gè)查詢的結(jié)果是X,第二個(gè)查詢的結(jié)果是Y,則用戶李鐵便可根據(jù)自己的工資數(shù)Z推算出用戶張群的工資為Y-(X-Z)。發(fā)生這個(gè)問題的原因是兩個(gè)查詢之間有很多重復(fù)的數(shù)據(jù)項(xiàng)。為了堵塞這種漏洞,可以制定規(guī)則:

規(guī)則2任意兩個(gè)查詢的相交數(shù)據(jù)項(xiàng)不能超過M個(gè)。

(3)可以證明:在上述兩條規(guī)定下,如果想獲知用戶“張群”的工資額,李鐵至少需要進(jìn)行1+(N-2)/M次查詢。為了堵塞這種漏洞,可以制定規(guī)則:

規(guī)則3任一用戶的查詢次數(shù)不能超過1+(N-2)/M。

當(dāng)然,這個(gè)規(guī)則也是可以突破的,如果兩個(gè)用戶合作查詢,則可使其失效。5.4.3SQL語言的自主存取控制方法

1.關(guān)系中的用戶權(quán)限

用戶權(quán)限主要包括兩個(gè)要素:數(shù)據(jù)對(duì)象和操作類型。定義用戶的存取權(quán)限稱為授權(quán),通過授權(quán)規(guī)定用戶可以對(duì)哪些數(shù)據(jù)進(jìn)行什么樣的操作。表5-2列出了不同類型的數(shù)據(jù)對(duì)象的操作權(quán)限。表5-2數(shù)據(jù)對(duì)象類型和操作權(quán)限

2.SQL的授權(quán)語句

授權(quán)語句用于將指定數(shù)據(jù)對(duì)象的指定權(quán)限授予指定的用戶,其一般形式為

GRANT權(quán)限1[,權(quán)限2,…]

[ON對(duì)象類型對(duì)象名稱]

TO用戶1[,用戶2,…]

[WITHGRANTOPTION];

【例5-18】為用戶授予操作表的權(quán)限。

(1)授予用戶user1權(quán)限:修改“學(xué)生”表中的“姓名”列、查詢表。

GRANTUPDATE(姓名),SELECT

ONTABLE學(xué)生

TOuser1;

(2)授予用戶user1和用戶user2權(quán)限:對(duì)“學(xué)生”表、“課程”表和“選課”表進(jìn)行查詢、修改、插入和刪除等。

GRANTALLPRIVILIGES

ONTABLE學(xué)生,課程,選課

TOuser1,user2;

(3)把對(duì)“課程”表的查詢權(quán)限授予所有用戶。

GRANTSELECT

ONTABLE課程

TOPUBLIC;

(4)把在數(shù)據(jù)庫“教學(xué)”中建立表的權(quán)限授予用戶user2。

GRANTCREATETAB

ONDATABASE教學(xué)

TOuser2;

(5)把對(duì)“學(xué)生”表的查詢權(quán)限授予用戶user3,并給用戶user3有再授予的權(quán)限。

GRANTSELECT

ONTABLE學(xué)生

TOuser3

WITHGRANTOPTION;

(6)用戶user3把查詢“學(xué)生”表的權(quán)限授予用戶user4。

GRANTSELECT

ONTABLE學(xué)生

TOuser4;

【例5-19】為用戶授予操作視圖的權(quán)限。

(1)建立“計(jì)算機(jī)22”學(xué)生的視圖:

CREATEVIEWstudentCS22

AS

SELECT*

FROM學(xué)生

WHERE班級(jí)='計(jì)算機(jī)22';

(2)在視圖上定義存取權(quán)限:“林萍”只能查看“計(jì)算機(jī)22”學(xué)生的數(shù)據(jù)。

GRANTSELECT

ONstudentCS22

TO林萍;

3.SQL的收權(quán)語句

收權(quán)語句用于將指定用戶的指定權(quán)限收回,其一般形式為

REVOKE權(quán)限1[,權(quán)限2…]

[ON對(duì)象類型對(duì)象名]

FROM用戶1[,用戶2…];

【例5-20】將用戶的操作權(quán)限收回。

(1)把用戶user1修改學(xué)生姓名的權(quán)限收回。

REVOKEUPDATE(姓名)

ONTABLE學(xué)生

FROMuser1;

(2)把用戶user3查詢“學(xué)生”表的權(quán)限收回。

REVOKESELECT

ONTABLE學(xué)生

FROMuser3;作為SQLServer數(shù)據(jù)庫的用戶,需要了解SQLServer的安全機(jī)制以及如何用之于安全設(shè)置,以保證“合法”用戶的正常訪問并阻止“非法”訪問。SQLServer中的身份驗(yàn)證、授權(quán)和驗(yàn)證機(jī)制可以保護(hù)數(shù)據(jù)免受未經(jīng)授權(quán)的泄漏和篡改。SQLServer安全機(jī)制可分為三個(gè)等級(jí),相應(yīng)地,用戶訪問SQLServer數(shù)據(jù)庫中的數(shù)據(jù)時(shí),需要經(jīng)過三個(gè)層次的驗(yàn)證,如圖5-2所示。5.5SQLServer安全機(jī)制圖5-2訪問SQLServer數(shù)據(jù)庫時(shí)的三層驗(yàn)證

(1)服務(wù)器級(jí)別的安全機(jī)制:主要通過登錄賬戶(登錄名)進(jìn)行控制。要想訪問一個(gè)數(shù)據(jù)庫服務(wù)器,必須擁有一個(gè)登錄賬戶。登錄賬戶可以是Windows賬戶或組,也可以是SQLServer的登錄賬戶。登錄賬戶可以屬于相應(yīng)的服務(wù)器角色(可理解為權(quán)限的組合)。也就是說,用戶需要通過一個(gè)登錄名(含密碼)登錄到SQLServer,或者通過登錄一個(gè)Windows賬號(hào)而映射到SQLServer。

(2)數(shù)據(jù)庫級(jí)別的安全機(jī)制:主要通過用戶賬戶(用戶名)進(jìn)行控制。訪問SQLServer服務(wù)器上的某個(gè)數(shù)據(jù)庫時(shí),必須擁有該數(shù)據(jù)庫的一個(gè)用戶賬戶。用戶賬戶是通過登錄賬戶進(jìn)行映射的,可以屬于固定的數(shù)據(jù)庫角色或自定義的數(shù)據(jù)庫角色。允許一個(gè)用戶與多個(gè)數(shù)據(jù)庫相連,實(shí)現(xiàn)的方法是在用戶賬戶中綁定多個(gè)登錄賬戶。

(3)數(shù)據(jù)對(duì)象級(jí)別的安全機(jī)制:通過設(shè)置數(shù)據(jù)對(duì)象的訪問權(quán)限進(jìn)行控制。例如,可以指定用戶有權(quán)使用哪些表和視圖、運(yùn)行哪些存儲(chǔ)過程等。為此需要授予每個(gè)數(shù)據(jù)庫中映射到用戶賬戶相應(yīng)的訪問權(quán)限,從而控制用戶在授權(quán)范圍內(nèi)執(zhí)行數(shù)據(jù)庫操作。

對(duì)于絕大多數(shù)非DBA、非程序員用戶來說,需要了解的是如何打開自用的SQLServer數(shù)據(jù)庫以及如何訪問其中的數(shù)據(jù)對(duì)象。下面以訪問SQLServer數(shù)據(jù)庫dbCourses為例,說明SQLServer數(shù)據(jù)庫的安全機(jī)制。

注:一般地,客戶操作系統(tǒng)的安全管理是操作系統(tǒng)管理員的任務(wù)。SQLServer不允許用戶建立服務(wù)器級(jí)的角色。為減少管理開銷,對(duì)象級(jí)上應(yīng)盡量賦予數(shù)據(jù)庫用戶較多的權(quán)限,然后具體針對(duì)某些敏感數(shù)據(jù)實(shí)施訪問限制即可。5.5.1SQLServer安全體系結(jié)構(gòu)

一個(gè)規(guī)模較大的SQLServer數(shù)據(jù)庫系統(tǒng)往往是一個(gè)多層次實(shí)體的集合。其中包含多個(gè)數(shù)據(jù)庫服務(wù)器,每個(gè)服務(wù)器中存儲(chǔ)了多個(gè)數(shù)據(jù)庫,每個(gè)數(shù)據(jù)庫中又包含表、視圖與存儲(chǔ)過程等多種對(duì)象。這里的每個(gè)實(shí)體都是需要保護(hù)的對(duì)象。每個(gè)SQLServer可保護(hù)對(duì)象都具有可授予主體(個(gè)人、組或授予訪問SQLServer權(quán)限的進(jìn)程)的關(guān)聯(lián)權(quán)限。SQLServer安全框架通過身份驗(yàn)證和授權(quán)來管理對(duì)可保護(hù)實(shí)體的訪問:

(1)身份驗(yàn)證是指通過提交服務(wù)器評(píng)估的憑據(jù)以登錄到主體請求訪問的SQLServer的過程。身份驗(yàn)證可以確定接受身份驗(yàn)證的用戶或進(jìn)程的標(biāo)識(shí)。

(2)授權(quán)是指確定主體(如某個(gè)數(shù)據(jù)庫用戶)可以訪問哪些可保護(hù)資源以及允許對(duì)這些資源執(zhí)行哪些操作的過程。

1.SQLServer數(shù)據(jù)庫的安全主體

主體是可以請求系統(tǒng)資源的個(gè)體或組合過程,可以代表特定的用戶、可由多個(gè)用戶使用的角色或應(yīng)用程序。例如,名為“teaDbo”的數(shù)據(jù)庫用戶是一種主體,可以按照自己的權(quán)限在數(shù)據(jù)庫中執(zhí)行操作或使用相應(yīng)的數(shù)據(jù)。

SQLServer數(shù)據(jù)庫系統(tǒng)有多種不同的主體,不同主體之間的關(guān)系是典型的層次關(guān)系:

(1)?Windows級(jí):包括Windows組、Windows域登錄名和Windows本地登錄名,通過Windows操作系統(tǒng)進(jìn)行安全驗(yàn)證。

(2)?SQLServer級(jí):包括SQLServer登錄名和固定服務(wù)器角色,通過SQLServer進(jìn)行安全驗(yàn)證。

(3)數(shù)據(jù)庫級(jí):包括數(shù)據(jù)庫用戶、固定數(shù)據(jù)庫角色和應(yīng)用程序角色,在數(shù)據(jù)庫內(nèi)部,數(shù)據(jù)庫角色(包含用戶或其他角色的組)和用戶都被授予使用數(shù)據(jù)庫對(duì)象的權(quán)限。最好的做法是設(shè)置可被授予的角色,將數(shù)據(jù)庫用戶納入角色中。

2.SQLServer數(shù)據(jù)庫的安全對(duì)象

安全對(duì)象是那些需要控制訪問和賦予主體權(quán)限的數(shù)據(jù)庫對(duì)象。SQLServer分為三個(gè)范圍,每個(gè)范圍內(nèi)受保護(hù)的對(duì)象都有區(qū)別。

(1)服務(wù)器范圍:服務(wù)器范圍的安全對(duì)象包括登錄賬號(hào)、HTTP(萬維網(wǎng)協(xié)議)端點(diǎn)、事件通知以及數(shù)據(jù)庫。這些都是存在于單個(gè)數(shù)據(jù)庫之外的服務(wù)器級(jí)別的對(duì)象,其訪問控制基于服務(wù)器端。

(2)數(shù)據(jù)庫范圍:數(shù)據(jù)庫范圍的安全對(duì)象包括模式、用戶、角色以及CLR(微軟.NET框架的公共語言運(yùn)行庫)程序集,存在于特定數(shù)據(jù)庫內(nèi)部,但不包含在某個(gè)模式之中。

(3)模式范圍:該組包括那些存在于數(shù)據(jù)庫模式內(nèi)部的對(duì)象(如表、視圖或存儲(chǔ)過程)。一個(gè)SQLServer模式大致對(duì)應(yīng)于SQLServer中的一組對(duì)象的擁有者(如dbo)。

3.SQLServer數(shù)據(jù)庫的安全級(jí)別

SQLServer安全機(jī)制大體上包括以下幾個(gè)等級(jí)。

(1)網(wǎng)絡(luò)上的訪問。網(wǎng)絡(luò)上的主機(jī)可以通過Internet訪問SQLServer服務(wù)器所在的網(wǎng)絡(luò),需要由網(wǎng)絡(luò)環(huán)境提供安全防護(hù)。例如,Windows網(wǎng)絡(luò)管理員負(fù)責(zé)建立用戶組,設(shè)置賬號(hào)并注冊,同時(shí)決定不同的用戶對(duì)不同系統(tǒng)資源的訪問級(jí)別。用戶只有擁有了一個(gè)有效的Windows登錄賬號(hào)才能對(duì)網(wǎng)絡(luò)系統(tǒng)資源進(jìn)行訪問。

(2)網(wǎng)絡(luò)內(nèi)的訪問。與SQLServer服務(wù)器同在一個(gè)網(wǎng)絡(luò)內(nèi)的主機(jī)通過登錄來連接SQLServer服務(wù)器。這首先要求對(duì)SQLServer的登錄方式、登錄名等進(jìn)行配置,用戶在登錄時(shí)需要提供正確的登錄名和密碼。

(3)數(shù)據(jù)庫級(jí)別的安全性主要通過數(shù)據(jù)庫用戶進(jìn)行控制。SQLServer的特定數(shù)據(jù)庫都有自己的用戶和角色,該數(shù)據(jù)庫只能由它自己的用戶或角色訪問,其他用戶無權(quán)接觸其中的數(shù)據(jù)。數(shù)據(jù)庫系統(tǒng)可以通過創(chuàng)建和管理特定數(shù)據(jù)庫的用戶和角色來保證不被非法用戶訪問。每個(gè)想要訪問數(shù)據(jù)庫的人(或應(yīng)用程序等)都必須擁有一個(gè)該數(shù)據(jù)庫的用戶身份。數(shù)據(jù)庫用戶是通過登錄名進(jìn)行映射的,登錄名可屬于固定的數(shù)據(jù)庫角色或自定義數(shù)據(jù)庫角色。

(4)數(shù)據(jù)庫對(duì)象的安全性是通過設(shè)置數(shù)據(jù)庫對(duì)象的訪問權(quán)限進(jìn)行控制的。SQLServer可以對(duì)權(quán)限進(jìn)行管理,并且可以保證合法用戶即使進(jìn)入了數(shù)據(jù)庫也不能進(jìn)行超越權(quán)限的數(shù)據(jù)存取操作。數(shù)據(jù)庫對(duì)象的安全性是SQLServer安全機(jī)制的最后一個(gè)等級(jí)。數(shù)據(jù)庫對(duì)象的訪問權(quán)限定義了數(shù)據(jù)庫用戶對(duì)數(shù)據(jù)庫對(duì)象的引用以及數(shù)據(jù)操作語句的權(quán)限。這可以通過定義對(duì)象和語句的許可權(quán)限來實(shí)現(xiàn)。在創(chuàng)建數(shù)據(jù)庫對(duì)象時(shí),SQLServer自動(dòng)將數(shù)據(jù)庫對(duì)象的擁有權(quán)賦予它的所有者。5.5.2SQLServer身份驗(yàn)證模式

1.兩種身份驗(yàn)證模式

Windows身份驗(yàn)證模式使用操作系統(tǒng)的身份驗(yàn)證機(jī)制來驗(yàn)證用戶身份,只要用戶能夠通過Windows用戶身份驗(yàn)證,即可連接到SQLServer服務(wù)器上,在其他操作系統(tǒng)中無法

使用。

注:SQLServer是在Windows平臺(tái)上運(yùn)行的,因此,有些Windows系統(tǒng)管理員也兼有SQLServer數(shù)據(jù)庫的DBA身份。這里的Windows賬號(hào)其實(shí)是他們在裝機(jī)時(shí)指定的自己登錄到Windows系統(tǒng)的賬號(hào)?;旌仙矸蒡?yàn)證模式使得用戶可以使用Windows身份驗(yàn)證或SQLServer身份驗(yàn)證與SQLServer服務(wù)器連接。這種模式分辨用戶賬號(hào)在Windows操作系統(tǒng)中是否可信,對(duì)于可信的連接用戶系統(tǒng)直接采用Windows身份驗(yàn)證模式,否則,SQLServer會(huì)通過賬戶的存在性和密碼的匹配性自行進(jìn)行驗(yàn)證。SQLServer身份驗(yàn)證模式是輸入與Windows操作系統(tǒng)無關(guān)的登錄名和密碼來登錄數(shù)據(jù)庫服務(wù)器的,通過這種模式進(jìn)行身份驗(yàn)證時(shí),設(shè)置密碼對(duì)于確保系統(tǒng)的安全性至關(guān)重要。

SQLServer的身份驗(yàn)證過程如圖5-3所示。圖5-3SQLServer的身份驗(yàn)證過程

2.設(shè)置身份驗(yàn)證模式

可以在SQLServer中設(shè)置身份驗(yàn)證模式,操作步驟如下:

(1)打開SQLServerManagementStudio窗口,并使用Windows或者SQLServer身份驗(yàn)證建立連接。

(2)在對(duì)象資源管理器中,右擊當(dāng)前服務(wù)器結(jié)點(diǎn),選擇快捷菜單中的“屬性”命令,打開服務(wù)器屬性對(duì)話框,如圖5-4所示。

(3)選擇“選擇頁”列表中的“安全性”項(xiàng),并在“服務(wù)器身份驗(yàn)證”欄中進(jìn)行設(shè)置。

設(shè)置或更改了身份驗(yàn)證模式之后,需要重啟服務(wù)器才能生效。圖5-4設(shè)置SQLServer身份驗(yàn)證模式

3.選擇身份驗(yàn)證模式

可以在啟動(dòng)SQLServer時(shí)選擇身份驗(yàn)證模式,方法是:打開SQLServerManagementStudio窗口之前,在顯示出的“連接到服務(wù)器”對(duì)話框的“身份驗(yàn)證”下拉列表框中進(jìn)行選擇,如圖5-5所示。圖5-5選擇SQLServer身份驗(yàn)證模式

4.創(chuàng)建Windows系統(tǒng)的用戶

【例5-21】在Windows中創(chuàng)建名為“yaoTea”的Windows用戶。

(1)選擇“開始”→“設(shè)置”→“控制面板”菜單項(xiàng),打開“控制面板”窗口。

(2)雙擊“管理工具”→“計(jì)算機(jī)管理”圖標(biāo),打開“計(jì)算機(jī)管理”窗口。

(3)單擊“本地用戶和組”結(jié)點(diǎn),右擊“用戶”圖標(biāo),選擇快捷菜單中的“新用戶”命令,彈出“新用戶”對(duì)話框。

(4)在“用戶名”文本框中輸入“yaoTea”,“全名”中輸入“yaoTea”,“密碼”與“確認(rèn)密碼”中輸入“YTPassword”,取消“用戶下次登錄時(shí)須更改密碼”項(xiàng)的選擇,勾選“密碼永不過期”項(xiàng),如圖5-6(a)所示。

(5)單擊“創(chuàng)建”按鈕,并關(guān)閉“新用戶”對(duì)話框,則在“用戶管理”窗口出現(xiàn)剛設(shè)置的賬戶,如圖5-6(b)所示。(a)(b)圖5-6創(chuàng)建Windows用戶的窗口與對(duì)話框

5.創(chuàng)建Windows驗(yàn)證模式的登錄賬戶

【例5-22】在SQLServer中創(chuàng)建“yaoTea”登錄名。

(1)在SQLServerManagementStudio窗口的“對(duì)象資源管理器”中,右擊“安全性”→“登錄名”結(jié)點(diǎn)并選擇快捷菜單中的“新建登錄名”命令,打開“登錄名-新建”對(duì)話框。

(2)單擊“搜索”按鈕,打開“選擇用戶或組”對(duì)話框,如圖5-7(a)所示;單擊其中的“高級(jí)”按鈕,打開“選擇用戶或組”的高級(jí)對(duì)話框;單擊其中的“立即查找”按鈕,則“選擇用戶或組”高級(jí)對(duì)話框下部將顯示W(wǎng)indows操作系統(tǒng)用戶的列表,如圖5-7(b)所示。(a)(b)圖5-7新建登錄名時(shí)選擇用戶或組的對(duì)話框

(3)選中前面創(chuàng)建的“yaoTea”用戶,然后單擊“確定”按鈕,回到“選擇用戶或組”對(duì)話框,則“輸入要選擇的對(duì)象名稱”列表中出現(xiàn)剛才選中的Window

溫馨提示

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

評(píng)論

0/150

提交評(píng)論