數據庫系統原理(第6章:數據庫安全與保護)

1、數據庫完整性

數據庫的安全保護:mysql

  • 完整性控制:數據庫完整性是指數據庫中數據的正確性和相容性
  • 安全性控制:數據庫防止不合法的操做而形成數據泄露、更改或破壞
  • 併發控制:事務就是爲了保證數據一致性而產生的一個概念和基本手段
  • 數據庫的備份與恢復:保證數據庫的可靠性和完整性

數據庫完整性是指數據庫中數據的正確性和相容性。sql

完整性約束的做用:防止數據庫中存在不符合語義的數據。數據庫

完整性約束條件的做用對象安全

  • 列級約束: 包括對列的類型、取值範圍、精度等的約束
  • 元組約束: 指元組中各個字段之間的相互約束
  • 表級約束: 指若干元組、關係之間的聯繫的約束

完整性約束條件是完整性控制機制的核心服務器

定義與實現完整性約束:實體完整性 、參照完整性、 用戶定義的完整性併發

**************************實體完整性**************************函數

實體完整性 :在MySQL中,實體完整性是經過主鍵約束和候選鍵約束實現的。加密

主鍵列必須遵照的規則spa

  • 每個表只能定義一個主鍵
  • 主鍵的值(鍵值)必須可以惟一標誌表中的每一行記錄,且不能爲NULL
  • 複合主鍵不能包含沒必要要的多餘列
  • 一個列名在複合主鍵的列表中只能出現一次

 

 

主鍵約束與候選鍵約束的區別 3d

  • 主鍵約束       一個表只能建立 一個主鍵     關鍵字 PRIMARY KEY
  • 候選鍵約束   能夠定義 若干個候選鍵     關鍵字 UNIQUE

***********************參照完整性*******************************

REFERENCES tbl_name(index_col_name,…) [ON DELETE reference_option]
 [ON UPDATE reference_option]

tbl_name:指定外鍵所參照的表名

index_col_name:指定被參照的列名

ON DELETE:指定參照動做相關的SQL語句

reference_option:指定參照完整性約束的實現策略 (RESTRICT-限制策略(默認的) | CASCADE-級聯策略 | SET NULL-置空策略 | NO ACTION-不採起實施策略)

 

 

 

**********************用戶定義的完整性****************************

非空約束:NOT NULL

CHECK 約束:CHECK(expr)

觸發器

命名完整性約束:CONSTRAINT [symbol]    symbol:指定的約束名字

只能給基於表的完整性約束指定名字,沒法給基於列的完整性約束指定名字

命名完整性約束的方法是在各類完整性約束的定義說明以前加上關鍵字( CONSTRAINT )和該約束的名字

更新完整性約束

使用ALTER TABLE語句更新與列或表有關的各類約束。

  • 一、完整性約束不能直接被修改。(先刪除,再增長)
  • 二、使用ALTER TABLE語句,能夠獨立地刪除完整性約束,而不會刪除表 自己。(DROP TABLE語句刪除一個表,則表中全部的完整性約束都會被 自動刪除)

 

2、觸發器

什麼是觸發器:是用戶定義在關係表上的一類由事件驅動的數據對象, 也是一種保證數據完整性的方法。

*************************建立觸發器******************************

使用CREATE TRIGGER語句建立觸發器

CREATE TRIGGER trigger_name trigger_time trigger_event ON tbl_name FOR EACH ROW trigger_body

trigger_name:指定觸發器的名稱

trigger_time:指定觸發器被觸發的時刻 

trigger_event:指定觸發器的觸發事件

tbl_name:指定與觸發器相關聯的表名

FOR EACH ROW :指定對於受觸發事件影響的每一 行都要激活觸發器的動做

trigger_body:指定觸發器動做主體

例如:在數據庫mysql_test的表customers中建立一個觸發器 customers_insert_trigger,用於每次向表customers插入一行數據時, 將用戶變量str的值設置爲one customer added!

CREATE TRIGGER mysql_test.customers_insert_trigger AFTER INSERT
 -> ON mysql_test.customers FOR EACH ROW SET @str=‘one customer added!’

使用DROP語句刪除觸發器

語法:DROP TRIGGER [IF EXISTS][schema_name.]trigger_name

  • IF EXISTS:用於避免在沒有觸發器的 狀況下刪除觸發器
  • schema_name:指定觸發器所在的數據庫的名稱
  • trigger_name:指定要刪除的觸發器名稱

例如:DROP TRIGGER IF EXISTS mysql_test.customers_insert_trigger;

使用觸發器

INSERT觸發器   DELETE觸發器   UPDATE觸發器

*******************INSERT觸發器***********************

在INSERT觸發器代碼內,可引用一個名爲NEW(不區分大小寫)的虛擬 表,來訪問被插入的行。 在BEFORE INSERT觸發器中,NEW中的值能夠被更新

例如:在數據庫mysql_test的表customers中從新建立觸發器 customers_insert_trigger,用於每次向表customers插入一行數據時, 將用戶變量str的值設置爲新插入客戶的id號。

CREATE TRIGGER mysql_test.customers_insert_trigger AFTER INSERT
 -> ON mysql_test.customers FOR EACH ROW SET @str=NEW.cust_id;

********************DELETE觸發器*************************

在DELETE觸發器代碼內,可引用一個名爲OLD(不區分大小寫)的虛擬 表,來訪問被刪除的行。 OLD中的值所有是隻讀的,不能被更新。

*******************UPDATE觸發器***************************

在UPDATE觸發器代碼內,可引用一個名爲OLD(不區分大小寫)的虛擬 表,來訪問UPDATE語句執行前的值,也能夠引用一個名爲NEW(不區 分大小寫)的虛擬表來訪問更新後的值

例如:在數據庫mysql_test的表customers中建立一個觸發器 customers_update_trigger,用於每次更新表customers時,將該表中cust_address列 的值設置爲cust_contact列的值。

CREATE TRIGGER mysql_test.customers_update_trigger BEFORE UPDATE
 -> ON mysql_test.customers FOR EACH ROW -> SET NEW.cust_address=OLD.cust_contact;

 

3、安全性與訪問控制

數據庫的安全性是指保護數據庫以防止不合法的使用而形成數據泄露、更 改或破壞,因此安全性對於任何一個DBMS來講都是相當重要的。

安全性與訪問控制:身份驗證 、數據庫用戶權 限確認

使用CREATE USER語句建立MySQL帳戶

語法:CREATE USER user   [IDENTIFIED BY [PASSWORD]’password’]

  • user格式:指定建立用戶帳號 格式:’user_name’@’host name’
  • IDENTIFIED BY:可選項,指定用戶帳號對應的口令
  • PASSWORD:可選項,指定散列口令

例如:在MySQL服務器中添加兩個新的用戶,其用戶名分別爲zhangsan 和lisi,他們的主機名均爲localhost,用戶zhangsan的口令爲123,用戶 lisi的口令爲對明文456使用PASSWORD()函數加密返回的散列值。

CREATE USER ‘zhangsan’@’localhost’ IDENTIFIED BY123’, -> ‘lisi’@’localhost’ IDENTIFIED BY PASSWORD ->*531E182E272080AB0740FE2F2D689DBE0146E04’;

使用DROP USER語句刪除用戶帳號

語法:DROP USER user [,user]…

例如:DROP USER lisi@localhost

使用RENAME USER語句修改用戶帳號

 

 

 例如:RENAME USER ‘zhangsan’@’localhost’ TO ‘wangwu’@’localhost’;

使用SET PASSWORD語句修改用戶登陸口令

SET PASSWORD [FOR user]= { PASSWORD(‘new_password’) |’encrypted password’ }

例如:SET PASSWORD FOR 'username'@'localhost' = PASSWORD('pass');

使用GRANT語句爲用戶受權

GRANT priv_type [(column_list)]
 [,priv_type [(column_list)]] … ON [object_type] priv_level TO user_specification [,user_specification][WITH GRANT OPTION]
  • priv_type:用於指定權限的名稱
  • column_list:用於指定權限要授予給表中哪些具體的列
  • object_type:用於指定權限授予的對象類型
  • priv_level:用於指定權限授予的級別
  • TO:用於設定用戶的口令,以及指定 被授予權限的用戶user
  • user_specification:user[IDENTIFIED BY [PASSWORD]’password’]
  • WITH :可選項,用於實現權限的轉移或限制

例如:授予用戶zhangsan在數據庫mysql_test的表customers上擁有對 列cust_id和列cust_name的SELECT權限。

GRANT SELECT(cust_id,cust_name) -> ON mysql_test.customers -> TO’zhangsan’@’localhost’;

授予當前系統中一個不存在的用戶liming和用戶huang,要求建立 這兩個用戶,並設置對應的系統登陸口令,同時授予他們在數據庫 mysql_test的表customers上擁有SELECT和UPDATE的權限。

GRANT SELECT,UPDATE
-> ON mysql_test.customers -> TO 'liming'@'localhost' IDENTIFIED BY '123', -> 'huang'@'localhost' IDENTIFIED BY '789';

授予系統中已存在的wangwu能夠在數據庫mysql_test中執行全部 數據庫操做的權限

GRANT ALL
 -> ON mysql_test.*
 -> TO ‘wangwu’@’localhost’;

授予系統中已存在的wangwu擁有建立用戶的權限

GRANT CREATE USER
 -> ON *.*
 -> TO ‘wangwu’@’localhost’;

權限的轉移

授予當前系統中不存在的用戶 zhou 在數據庫mysql_test的表customers上 擁有SELECT和UPDATE的權限,並容許其能夠將自身的這個權限授予給其餘 用戶

GRANT SELECT,UPDATE
 -> ON mysql_test.customers -> TO ‘zhou’@’localhost’ IDENTIFIED BY123-> WITH GRANT OPTION;

使用REVOKE語句撤銷用戶權限

REVOKE priv_type [(column_list)]
 [,priv_type [(column_list)]] … ON [object_type] priv_level FROM user [,user]

回收系統中已存在用戶zhou在數據庫mysql_test的表customers 上的SELECT權限

REVOKE SELECT
 -> ON mysql_test.customers -> FROM ‘zhou’@’localhost’;

 

4、事務與併發控制

所謂事務是用戶定義的一個數據操做序列,這些操做可做爲一個完整的工 做單元,要麼所有執行,要麼所有不執行,是一個不可分割的工做單位。 事務中的操做通常是對數據的更新操做,包括增、刪、改。

 

 以BEGIN TRANSACTION語句開始 以 COMMIT 語句或  ROLLBACK語句結束

事務的特徵(ACID):

  • 原子性 Atomicity:事務是不可分割的最小工做單位
  • 一致性 Consistenc y:
  • 隔離性 Isolation:
  • 持續性(永久性) Durability

例題:依據事務的ACID特徵,分析並編寫銀行數據庫系統中的轉帳事務T:從帳 戶A轉帳S金額資金到帳戶B

BEGIN TRANSACTION
read(A); A=A-S; write(A); If(A<0)ROLLBACK; else read(B); B=B+S write(B); COMMIT;}

併發操做問題

  • 丟失更新 • 事務T1,T2同時讀入同一數據並加以修改,T2的提交結果會破壞T1提交的結果
  • 不可重複讀 • 事務T1讀取數據後,事務T2執行更新操做,使T1沒法再現前一次讀取結果
  • 讀「髒」數據 • 事務T1修改數據後撤銷,使得T2讀取的數據與數據庫中不一致

封鎖是最經常使用的併發控制技術 基本思想:須要時,事務經過向系統請 求對它所但願的數據對象加鎖,以確保 它不被非預期改變

鎖 :一個鎖實質上就是容許或阻止一個事務對一個數據對象的存取特權。

基本的封鎖類型:

  • 一、排他鎖(X鎖),用於寫操做
  • 二、共享鎖(S鎖),用於讀操做

封鎖的工做原理:

  • 1.若事務T對數據D加了X鎖,則全部別的事務對數據D的鎖請求都必須等 待直到事務T釋放鎖。
  • 2.若事務T對數據D加了S鎖,則別的事務還可對數據D請求S鎖,而對數據 D的X鎖請求必須等待直到事務T釋放鎖。
  • 3.事務執行數據庫操做時都要先請求相應的鎖,即對讀請求S鎖,對更新 請求X鎖。這個過程通常是由DBMS在執行操做時自動隱含地進行。
  • 4.事務一直佔有得到的鎖直到結束時釋放

封鎖的粒度

  • 咱們一般以粒度來描述封鎖的數據單元的大小
  • DBMS能夠決定不一樣粒度的鎖 粒度越細,併發性就越大,但軟件複雜性和系統開銷也就越大。

封鎖的級別又稱爲一致性級別或隔離度

  • 0級封鎖:不重寫其餘非0級封鎖事務的未提交的更新數據。(實用價值低)
  • 1級封鎖:不容許重寫未提交的更新數據。防止了丟失更新的發生
  • 2級封鎖:既不重寫也不讀未提交的更新數據(防止了讀髒數據)
  • 3級封鎖:不讀未提交的更新數據,不寫任何(包括讀操做)未提交數據。

死鎖和活鎖

  • 活鎖——活鎖的處理方案: 先來先服務
  • 死鎖——活鎖的預防方案: (1)一次性鎖請求 (2)鎖請求排序 (3)序列化處理 (4)資源剝奪  ;死鎖檢測:圖論的方法檢測死鎖,並以正在執行的事務爲節點

可串行性

  • 一組事務的一個調度就是它們的基本操做的一種排序。
  • 在數據庫系統中,可串行性就是併發執行的正確性準則,即當且當一組事務 的併發執行調度是可串行化的,才認爲它們是正確的。

兩段封鎖法

  • 1.發展(Growing)或加鎖階段
  • 2.收縮(Shrinking)或釋放鎖階段

5、備份與恢復 

數據丟失的途徑:

1.計算機硬件故障

2.計算機軟件故障

3.病毒

4.人爲誤操做

5.天然災害

6.盜竊

數據庫備份與恢復的概念

  • 數據備份是指經過導出數據或者複製表文件的方式來製做數據庫的複本;
  • 數據庫恢復則是當數據庫出現故障或遭到破壞時,將備份的數據庫加載到 系統,從而使數據庫從錯誤狀態恢復到備份時的正確狀態。 數據庫的恢復是以備份爲基礎的,它是與備份相對應的系統維護和管理操 做。

使用SELECT INTO…OUTFILE語句備份數據

SELECT *INTO OUTFILE ‘file_name’ export_options | INTO DUMPFILE ‘file_name

file_name:指定數據備份文件的名稱

 

使用LOAD DATA…INFILE語句恢復數據

 

簡述恢復數據的方法?

備份數據庫mysql_test中表customers的所有數據到c盤的BACKUP目錄 下一個名爲backupfile.txt的文件中,要求字段值若是是字符則用雙引號 標註,字段值之間用逗號隔開,每行以問號爲結束標誌。而後,將備份後 的數據導入到一個和customers表結構相同的空表customers_copy中。

SELECT * FROM mysql_test.customers INTO OUTFILE ‘C:/BACKUP/backupfile.txt’ FIELDS TERMINATED BY ’,’ OPTIONALLY ENCLOSED BY 「」 LINES TERMINATED BY ‘?’;
相關文章
相關標籤/搜索