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

下載本文檔

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

文檔簡介

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

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

5.3觸發(fā)器

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

5.5SQLServer安全機制

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

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

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

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

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

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

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

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

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

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

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

2.有效性檢查

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

3.實體完整性

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

4.引用(參照)完整性

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

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

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

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

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

7.數(shù)據(jù)一致性

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

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

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

1.完整性約束條件

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

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

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

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

2.DBMS的完整性控制機制

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

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

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

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

3.完整性規(guī)則

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

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

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

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

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

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

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

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

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

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

1.實體完整性定義

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

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

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

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

CREATETABLE學生(

學號CHAR(10)PRIMARYKEY,

姓名CHAR(20)NOTNULL,

性別CHAR(2),

年齡SMALLINT,

班級CHAR(4)

);

(2)表級“學生”表中的主鍵:

CREATETABLEStudent(

學號CHAR(10)PRIMARYKEY,

姓名CHAR(20)NOTNULL,

性別CHAR(2),

年齡SMALLINT,

班級CHAR(4),

PRIMARYKEY(學號)

);

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

CREATETABLEStudent(

學號CHAR(10)NOTNULL,

課程號CHAR(6)NOTNULL,

PRIMARYKEY(學號,課程號)

);

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

將學生表中的“學號”設置為主鍵的語句:

ALTERTABLE學生

ADDCONSTRAINTsID_pkprimarykey學號

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

ALTERTABLE學生

ADDCONSTRAINTsName_ukUNIQUE姓名

2.實體完整性檢查和違約處理

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

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

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

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

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

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

CREATETABLE表名(

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

REFERNCES被引用表(被引用列)

[ONDELETE{CASCADE|NOACTION}]

[ONUPDATE{CASCADE|NOACTION}]

[字段名…]

);

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

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

●創(chuàng)建從表“選課”表,其中“學號”為對應于“學生”表中主鍵的外鍵,“課號”為對應于“課程”表中主鍵的外鍵。

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

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

CREATETABLE學生(

學號CHAR(10)PRIMARYKEY,

姓名CHAR(10)

…);

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

CREATETABLE課程(

課號CHAR(6)PRIMARYKEY,

課名CHAR(18)

…);

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

●設“學號”為外鍵,與“學生”表中主鍵對應,在對學生表進行更新或刪除操作時,當前表進行級聯(lián)操作。

●設“課號”為外鍵,與“課程”表主鍵對應,在對課程表進行更新或刪除操作時,當前表采用回滾方式。

CREATETABLE選課(

學號CHAR(10)FOREIGNKEYREFERENCES學生(學號)

ONDELETECASCADE

ONUPDATECASCADE,

課號CHAR(6)FOREIGNKEYREFERENCES課程(課號)

ONDELETENOACTION

ONUPDATENOACTION,

分數(shù)INT

);

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

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

ALTERTABLE表名

ADD[CONSTRAINT約束名]

[FOREIGNKEY](列名[,…])

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

[ONDELETE{CASCADE|NOACTION}]

[ONUPDATE{CASCADE|NOACTION}];

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

ALTERTABLE選課

ADDCONSTRAINTscFk

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

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

●修改了主表中的主鍵而從表中的外鍵未做相應改變。

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

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

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

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

例如,想要刪除“學生”表中“學號=2012015122”的元組,而“選課”表中有5個元組的“學號=201215122”,則可采用以下幾種違約處理方法。

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

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

●置空值刪除:將“選課”表中所有“學號=2012015122”的元組的“學號”值置為空值。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

CREATETABLE選課(

學號CHAR(10)NOTNULL,

課號CHAR(6)NOTNULL,

成績SMALLINTNOTNULL,

PRIMARYKEY(學號,課號)

);

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

CREATETABLE班級(

班號CHAR(6),

班級名CHAR(10)UNIQUE,

學院號CHAR(2),

PRIMARYKEY(班號)

);

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

CREATETABLE學生(

學號CHAR(10)PRIMARYKEY,

姓名CHAR(10)NOTNULL,

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

年齡SMALLINT,

班號CHAR(6)

);

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

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

CREATETABLEStudent(

學號CHAR(10),

姓名CHAR(10)NOTNULL,

性別CHAR(2),

年齡SMALLINT,

班號CHAR(6),

PRIMARYKEY(學號),

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

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

1.完整性約束命名子句

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

CONSTRAINT<完整性約束條件名>

[ PRIMARYKEY短語

|FOREIGNKEY短語

|CHECK短語]

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

CREATETABLE學生(

學號CHAR(10)CONSTRAINTcID

CHECK(學號BETWEEN'20120101'AND'20120125'),

姓名CHAR(10)CONSTRAINTcNameNOTNULL,

年齡SMALLINTCONSTRAINTcAgeCHECK(年齡<30),

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

CONSTRAINTkeyStuPRIMARYKEY(學號)

);

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

CREATE教工(

工號CHAR(6)PRIMARYKEY,

姓名CHAR(10),

職業(yè)CHAR(8),

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

扣除NUMERIC(7,2),

單位號CHAR(2),

CONSTRAINTkeyEmpFOREIGNKEY(單位號)REFERENCES單位(單位號),

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

);

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

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

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

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

ALTERTABLE

DROPCONSTRAINTcSex;

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

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

ALTERTABLE學生

DROPCONSTRAINTcID;

再增加新的約束條件:

ALTERTABLE學生

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

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

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

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

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

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

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

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

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

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

AS

<SQL語句>;

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

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

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

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

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

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

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

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

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

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

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

CREATETRIGGERsaveDeleteON學生

AFTERDELETE

AS

INSERTINTO學生_暫存

(SELECT*FROMdeleted);

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

刪除“學生”表中某個學生的記錄之后,自動從“選課”表中刪除該生的選課記錄。

CREATETRIGGERcascadingDeleteON學生

AFTERDELETE

AS

DELETEFROM選課

WHERE學號IN

(SELECT學號FROMdeleted);

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

CREATETRIGGERinsStuTrigON學生

FORINSERT

ASbegin

declare@sClassCHAR(10)

SELECT@sClass=班名FROMinserted

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

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

else

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

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

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

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

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

(3)用于滿足特定條件時自動執(zhí)行某項任務。

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

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

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

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

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

CREATETABLE操作登記(

用戶號CHAR(10)NOTNULL,

操作日期DATETIMENOTNULL,

操作種類CHAR(6)NOTNULL,

CONSTRAINTtracePKPRIMARYKEY(用戶號,操作日期)

);

(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語句,同時將該語句中插入的記錄送入inserted表,然后啟動INSERT觸發(fā)器并執(zhí)行其中的操作。

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

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

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

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

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

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

理學生(學號,姓名,性別,學院,生日,電話)

工學生(學號,姓名,性別,學院,生日,電話)

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

生”表。

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

CREATEVIEWstudentView

AS

SELECT*FROM理學生

UNION

SELECT*FROM工學生;

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

CREATETRIGGERstuUpdate

ONStudentView

INSTEADOFUPDATE

AS

DECLARE@stuDeptvarchar(15)

SET@dept=(SELECT學院FROMinserted)

IF@dept='理'begin

UPDATE理學生SET理學生.電話=Inserted.電話

FROM理學生.JOINInsertedON理學生.學號=Inserted.學號end

ELSEIF@dept='工'begin

UPDATE工學生

SET工學生.電話=Inserted.電話

FROM工學生JOINInsertedON工學生.學號=Inserted.學號

end;

4.修改觸發(fā)器

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

ALTERTRIGGER觸發(fā)器名

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

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

AS

<SQL語句>;

5.刪除觸發(fā)器

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

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

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

DROPTRIGGERinsertSalONTeacher;

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

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

ALTERTABLE<表名>

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

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

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

1.數(shù)據(jù)安全性控制方式

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

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

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

2.安全性級別

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

(1)環(huán)境級:對計算機機房和設備加以保護,防止物理破壞。

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

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

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

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

3.數(shù)據(jù)庫訪問的權(quán)限問題

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

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

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

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

1.用戶標識與鑒別

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

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

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

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

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

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

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

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

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

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

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

顯然,自主存取控制比較靈活,強制存取控制比較嚴格。

3.視圖機制

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

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

4.審計方法

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

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

5.數(shù)據(jù)加密

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

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

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

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

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

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

●本公司共有多少個高級女程序員?

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

[ON對象類型對象名稱]

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

[WITHGRANTOPTION];

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

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

GRANTUPDATE(姓名),SELECT

ONTABLE學生

TOuser1;

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

GRANTALLPRIVILIGES

ONTABLE學生,課程,選課

TOuser1,user2;

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

GRANTSELECT

ONTABLE課程

TOPUBLIC;

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

GRANTCREATETAB

ONDATABASE教學

TOuser2;

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

GRANTSELECT

ONTABLE學生

TOuser3

WITHGRANTOPTION;

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

GRANTSELECT

ONTABLE學生

TOuser4;

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

(1)建立“計算機22”學生的視圖:

CREATEVIEWstudentCS22

AS

SELECT*

FROM學生

WHERE班級='計算機22';

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

GRANTSELECT

ONstudentCS22

TO林萍;

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

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

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

[ON對象類型對象名]

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

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

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

REVOKEUPDATE(姓名)

ONTABLE學生

FROMuser1;

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

REVOKESELECT

ONTABLE學生

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

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

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

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

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

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

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

(1)身份驗證是指通過提交服務器評估的憑據(jù)以登錄到主體請求訪問的SQLServer的過程。身份驗證可以確定接受身份驗證的用戶或進程的標識。

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

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

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

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

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

(2)?SQLServer級:包括SQLServer登錄名和固定服務器角色,通過SQLServer進行安全驗證。

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

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

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

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

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

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

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

SQLServer安全機制大體上包括以下幾個等級。

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

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

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

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

1.兩種身份驗證模式

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

使用。

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

SQLServer的身份驗證過程如圖5-3所示。圖5-3SQLServer的身份驗證過程

2.設置身份驗證模式

可以在SQLServer中設置身份驗證模式,操作步驟如下:

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

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

(3)選擇“選擇頁”列表中的“安全性”項,并在“服務器身份驗證”欄中進行設置。

設置或更改了身份驗證模式之后,需要重啟服務器才能生效。圖5-4設置SQLServer身份驗證模式

3.選擇身份驗證模式

可以在啟動SQLServer時選擇身份驗證模式,方法是:打開SQLServerManagementStudio窗口之前,在顯示出的“連接到服務器”對話框的“身份驗證”下拉列表框中進行選擇,如圖5-5所示。圖5-5選擇SQLServer身份驗證模式

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

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

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

(2)雙擊“管理工具”→“計算機管理”圖標,打開“計算機管理”窗口。

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

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

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

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

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

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

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

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

溫馨提示

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

評論

0/150

提交評論