數據庫的安全保護:mysql
數據庫完整性是指數據庫中數據的正確性和相容性。sql
完整性約束的做用:防止數據庫中存在不符合語義的數據。數據庫
完整性約束條件的做用對象安全
完整性約束條件是完整性控制機制的核心服務器
定義與實現完整性約束:實體完整性 、參照完整性、 用戶定義的完整性併發
**************************實體完整性**************************函數
實體完整性 :在MySQL中,實體完整性是經過主鍵約束和候選鍵約束實現的。加密
主鍵列必須遵照的規則spa
主鍵約束與候選鍵約束的區別 3d
***********************參照完整性*******************************
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語句更新與列或表有關的各類約束。
什麼是觸發器:是用戶定義在關係表上的一類由事件驅動的數據對象, 也是一種保證數據完整性的方法。
*************************建立觸發器******************************
使用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
例如: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;
數據庫的安全性是指保護數據庫以防止不合法的使用而形成數據泄露、更 改或破壞,因此安全性對於任何一個DBMS來講都是相當重要的。
安全性與訪問控制:身份驗證 、數據庫用戶權 限確認
使用CREATE USER語句建立MySQL帳戶
語法:CREATE USER user [IDENTIFIED BY [PASSWORD]’password’]
例如:在MySQL服務器中添加兩個新的用戶,其用戶名分別爲zhangsan 和lisi,他們的主機名均爲localhost,用戶zhangsan的口令爲123,用戶 lisi的口令爲對明文456使用PASSWORD()函數加密返回的散列值。
CREATE USER ‘zhangsan’@’localhost’ IDENTIFIED BY ‘123’, -> ‘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]
例如:授予用戶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 BY ‘123’ -> 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’;
所謂事務是用戶定義的一個數據操做序列,這些操做可做爲一個完整的工 做單元,要麼所有執行,要麼所有不執行,是一個不可分割的工做單位。 事務中的操做通常是對數據的更新操做,包括增、刪、改。
以BEGIN TRANSACTION語句開始 以 COMMIT 語句或 ROLLBACK語句結束
事務的特徵(ACID):
例題:依據事務的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;}
併發操做問題
封鎖是最經常使用的併發控制技術 基本思想:須要時,事務經過向系統請 求對它所但願的數據對象加鎖,以確保 它不被非預期改變
鎖 :一個鎖實質上就是容許或阻止一個事務對一個數據對象的存取特權。
基本的封鎖類型:
封鎖的工做原理:
封鎖的粒度
封鎖的級別又稱爲一致性級別或隔離度
死鎖和活鎖
可串行性
兩段封鎖法
數據丟失的途徑:
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 ‘?’;