數據庫系統原理第六章

第六章 數據庫安全與保護

**大家想一起學習交流的可以加羣,WX:MrCroods。**

DBMS對數據庫的安全保護功能是通過完整性約束控制、訪問控制、事務與併發控制以及備份與恢復。

第一節 數據庫完整性

數據庫完整性:數據庫中數據的正確性和相容性。
數據庫完整性的作用:防止數據庫中存在不符合語義的數據,爲了維護數據的完整性。
DBMS檢查數據是否滿足完整性約束條件的機制就稱爲完整性檢查。

一、完整性約束條件的作用對象

完整性約束條件的作用對象:列、元組、表

(1)、列級約束(簡單題

1、對數據類型的約束
2、對數據格式的約束
3、對取值範圍或取值集合的約束
4、對空值的約束

(2)、元組約束

元組約束是指元組中各個字段之間的相互約束。

(3)、表級約束

表級約束是指元組之間、關係之間的聯繫的約束。

二、定義與實現完整性約束

關係模型中有三類完整性約束:實體完整性、參照完整性、用戶定義的完整性

(1)、實體完整性

實體完整性通過主鍵約束和候選鍵約束實現。
1、主鍵約束
一種作爲列的完整性約束,放在所需列之後。
一種作爲表的完整性約束,放在所有列屬性的最後面。

主鍵應遵守規則

1)、每一個表只能定義一個主鍵。
2)、主鍵的值,也稱爲鍵值,必須唯一標誌表中的每一行記,且不能爲NULL。
3)、複合主鍵不能包含不必要的多餘列。
4)、一個列名在複合主鍵的列表中只能出現一次。

2、候選鍵約束

可以定義在某個列上,也可以定義在所有列之後,其值必須唯一,且不能爲NULL。

3、二者區別:
1)、一個表中只能創建一個主鍵,但可以定義若干候選鍵。
2)、定義主鍵約束時,系統自動產生PRIMARY KEY索引
3)、定義候選鍵約束時,系統自動產生UNIQUE索引。

(2)、參照完整性
參照完整性通過創建表或更新表的同時定義一個外鍵聲名來實現的。

第一個種:在表中某個列的屬性定義後直接加上“reference_definition”。
第二個種:在表中所有列的屬性定義後添加“FOREIGN KEY() REFERENCES… ”

1、外鍵應遵守規則(簡單題

1)、被參照表必須已經用一條CREATE TABLE語句創建。如若是當前正在創建的表,被參照表與參照表是同一表,自參照表,結構稱爲自參照完整性。
2)、必須爲被參照表定義主鍵。
3)、必須在被參照表的表名後面指定列名或列名的組合。這個列或列名組合必須是被參照表的主鍵或候選鍵。
4)、儘管主鍵是不能包含空值,但允許在外鍵中出現一個空值。
5)、外鍵中的列的數目必須和被參照表的主鍵的列的數目相同。
6)、外鍵中的列的數據類型必須和被參照表的主鍵中的對應列的數據類型相同。

2、指定策略
RESTRICT,限制策略,當刪除或更新被參照表中被參照列上,並在外鍵中出現的值時,系統拒絕對被參照表的刪除或更新操作。(相似的限制策略:NO ACTION)
CASCADE,級聯策略,從被參照表中刪除或更新記錄行時,自動刪除或更新參照表中匹配的記錄行。
SET NULL,置空策略,從被參照表中刪除或更新記錄行時,設置參照表中與之對應的外鍵列的值爲NULL。(外鍵列沒有聲明限定詞NOT NULL)

(3)、用戶定義的完整性
用戶定義的完整性約束:非空約束、CHECK約束、觸發器

三、命名完整性約束

爲了刪除或修改完整性約束,首先需要定義約束的同時對其進行命名,使用
CONSTRAINT “約束名”

四、更新完整性約束

(1)、使用ALTER TABLE,注意以下兩點:

完整性約束不能直接修改。實際是先刪除後添加相同約束名的新約束。
使用ALTER TABLE語句,可獨立刪除完整性約束。

第二節 觸發器

觸發器(Trigger)是用戶定義在關係表上的一類由事件驅動的數據庫對象,也是一種保證數據完整性的方法。
(觸發器定義後,任何對錶的修改操作均由數據庫服務器自動激活相應的觸發器)

觸發器的作用:實現主鍵和外鍵不能保證的複雜的參照完整性和數據一致性,有效保護表中的數據。

一、創建觸發器

在創建觸發器中,每個表每個事件每次只允許一個觸發器。
每個表最多支持6個觸發器。單一觸發器不能與多個事件或多個表關聯。

CREATE TRIGGER MySQL_test.customers_insert_trigger (觸發器名稱)
AFTER (觸發器被觸發的時刻)

BEFORE:希望驗證新數據是否滿足使用的限制。
AFTER:希望在激活觸發器的語句執行之後完成幾個或更多的改變。

INSERT (觸發事件:INSERT、UPDATE、DELETE)
ON MySQL_test.customers (表名)
FOR EACH ROW (每一行都要觸發)
@str=‘one customer added!’; (要執行的SQL語句)

二、刪除觸發器

DROP TRIGGER IF EXISTS MySQL_test.customers_insert_trigger;(觸發器名稱)

三、使用觸發器

(1)、INSERT觸發器注意以下幾點:

1)、在INSERT觸發器中,可引用NEW的虛擬表,來訪問被插入的行。
2)、在BEFORE INSERT觸發器中,NEW中的值也可以被更新。
3)、對於AUTO_INCREMENT中NEW在INSERT執行之前包含的是0值,在INSERT執行之後將包含新的自動生成值。

(2)、DELETE觸發器注意以下幾點:

1)、在DELETE觸發器中,可引用OLD的虛擬表,來訪問被刪除的行,可引用NEW的虛擬表,來訪問新更新的值。
2)、OLE中的值全部是隻讀的,不能被更新。

(3)、UPDATE觸發器注意以下幾點:

1)、在INSERT觸發器中,可引用OLD的虛擬表,來訪問以前的值。
2)、在BEFORE INSERT觸發器中,NEW中的值也可以被更新(只有被UPDATE語句更新的值才能放入NEW表中)。
3)、OLE中的值全部是隻讀的,不能被更新。
4)、當觸發器涉及對觸發表自身的更新操作時,只能使用BEFORE INSERT,而AFTER UPDATE觸發器不能使用。

第三節 安全性與訪問控制

數據庫的安全性是指保護數據庫以防止不合法的使用而造成數據泄露、更改或破壞。
數據庫系統對數據的安全管理是使用身份驗證、數據庫用戶權限確認等訪問控制措施,其作用保護數據庫中的信息資源,以防止數據遭到破壞

一、用戶賬號管理

MySQL的用戶賬號及相關信息都存儲在一個名爲mysql的數據庫中,其中只有一個表——user的數據表。

(1)、創建用戶賬號
CREATE USER ‘zhangsan’@‘localhost’ (用戶名@主機名)
IDENTIFIED BY ‘123’,(IDENTIFIED BY,可選項,指定用戶賬號對應的口令)
‘lisi’@‘localhost’ IDENTIFIED BY PASSWORD ‘04512638’;(設置口令)

(2)、刪除用戶賬號
DROP USER lisi@localhost;

(3)、修改用戶賬號
RENAME USER ‘zhangsan’@‘localhost’ TO ‘wangwu’@‘localhost’;

(4)、修改用戶口令
SET PASSWORD FOR ‘wangwu’@‘localhost’ = ‘654316346’;

二、賬號權限管理

(1)、權限的授予
GRANT
SELECT (權限的名稱:SELECT、UPDATE、DELETE)
(cust_id,cust_name)(表中具體的列)
on (用於指定權限授予的對象類型)
MySQL_test.customers(權限的級別,“星號*”全部表,“.*”當前數據庫全部表,“.表明”點後的表)
TO(用於設定用戶的口令)
‘zhangsan’@‘localhost’;(用戶)

(2)、權限的轉移
通過GRANT語句中使用WITH子句來實現。如果將WITH子句指定爲關鍵字“WITH GRANT OPTION”,則表示TO子句中所指定的所有用戶都具有把自己所擁有的權限授予給其他用戶的權利。

(3)、權限的撤銷(選擇題、填空題

1、不刪除用戶,只是撤銷權限,使用
REVOKE…
REVOKE SELECT
ON MySQL_test.customers
FROM ‘zhangsan’@‘localhost’;
2、收回用戶所有權限時,使用
REVOKE ALL PRIVILEGES,GRANT OPTION FORM user

使用REVOKE語句,必須擁有MYSQL數據庫的全局CREATE USER 權限或UPDATE權限。

第四節 事務與併發控制

一、事務的概念

事務是用戶自定義的一個數據操作序列,可作爲完整的工作單元,要麼全部執行,要麼全部不執行,不可分割。

二、事務的特徵

(1)、數據庫系統必須保證事務具有四個特徵:原子性,一致性,隔離性和持續性,四個特徵簡稱爲ACID特徵。

1、原子性
事務是不可分割的最小工作單位。
2、一致性
事務必須滿足數據庫的完整性約束,且事務執行完畢後將數據庫由一個一致性狀態變到另一個一致性狀態。
3、隔離性
要求事務是彼此獨立的、隔離的,一個食物的執行不能被其他事務所幹擾
4、持續性(也稱爲永久性)
一個事務一旦提交,其對數據的更改是永久的,其他操作也不會影響執行結果。

三、併發操作問題

(1)、事務是併發控制的基本單位,保證事務的ACID特徵是事務處理的重要任務,
併發操作問題,有如下三種

1、丟失更新

兩個事務T1、T2,T2提交的結果會破化T1提交的結果。

2、不可重複讀

兩個事務T1、T2,
T1讀取某一數據,T2更新數據,T1在讀取數據發現數據不一致。
T1讀取某一數據,T2刪除數據,T1在讀取數據發現數據消失了。
T1讀取某一數據,T2插入數據,T1在讀取數據發現了兩條數據。

3、讀髒數據

兩個事務T1、T2,T1修改某一數據,T2讀取數據,T1被撤銷,數據恢復原值,T2在讀取數據發現與第一次讀取數據不一致。

四、封鎖

(1)、封鎖基本思想:需要時,事務通過向系統請求對它所希望的數據對象加鎖,確保它不被非預期改變。
(2)、封鎖的兩種類型:排他鎖(X鎖,對數據插入、刪除、修改使用)、共享鎖(S鎖,讀數據使用)。(事務一直佔有獲得的鎖直到結束時釋放。)
(3)、通常以粒度來描述封鎖的數據單元的大小,DBMS可以決定不同粒度大小的鎖,其粒度越細,併發性越大,但軟件複雜性和系統開銷也大。
(4)、有四種封鎖級別

1、0級封鎖
2、1級封鎖
被封鎖的事務不允許重寫未提交的更新數據,防止丟失更新發生。
3、2級封鎖
被封鎖的事務不重寫也不讀未提交的更新數據,1級封鎖效果還防止讀髒數據。
4、3級封鎖
被封鎖的事務不讀未提交的更新數據,也不寫任何未提交的數據,也不寫未提交的讀數據。防止不可重讀的問題,也保證多個事務併發執行的”可串行化“。

(5)、活鎖和死鎖
活鎖:併發事務處理過程中,由於鎖會使一事務處於等待狀態而調度其他事務處理,因而該事務可能會因優先級低而永遠等待下去。
死鎖:兩個以上事務循環等待被同組中另一個事務鎖住的數據單元的情形。

1、預防死鎖的方法:

1)、一次性鎖請求:每一事務在處理時一次提出所有的鎖請求,僅當這些請求全部滿足時事務處理才行,否則讓其等待。
2)、鎖請求排序:將每個數據單元標以線性順序,然後要求每一事務都按此順序提出鎖請求。
3)、序列化處理:通過應用設計爲每一數據單元建立一個”主人“程序,對給定數據單元的所有請求都發送給”主人“,其以單道形式運行。
4)、資源剝奪:每當事務因鎖請求不能滿足而受阻,強行令兩個衝突事務中的一個ROLLBACK,釋放所有的鎖,以後重新運行。

死鎖檢測可以用圖論的方法實現,並以正在執行的事務爲結點。(選擇題、填空題)

(6)、可串行性

在數據庫系統中,可串行性就是併發執行的正確性準則,即當且僅當一組事務的併發調度是可串行化的,才認爲它們是正確的。

(7)、兩段封鎖法

兩段封鎖法是一種最簡單而有效的保障封鎖其調度是可串行的方法。
兩段封鎖協議中規定:任何一個事務,所有加鎖操作必須在所有釋放鎖操作之前。

(8)、事務劃分有以下兩個階段:
發展或加鎖階段;收縮或釋放鎖階段

第五節 備份與恢復

數據庫備份:通過導出數據或者複製表文件的方式來製作數據的複本。
數據庫恢復:當數據庫出現故障或遭到破壞時,將備份的數據庫加載到系統,從而使數據庫從錯誤狀態恢復到備份時的正確狀態。
數據庫的備份與恢復作用:保證數據庫中的數據的可靠性和完整性。

導致運行事物異常中斷的因素:計算機硬件故障、計算機軟件故障、病毒、人爲誤操作、自然災害、盜竊。

(1)、使用SELECT INTO…OUTFILE語句備份數據
(2)、使用LOAP DATA…INSERT語句恢復數據

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章