數(shù)據(jù)庫(kù)安全性
1.數(shù)據(jù)庫(kù)的不安全因素
- 非授權(quán)用戶對(duì)數(shù)據(jù)庫(kù)的惡意存取和破壞
- 數(shù)據(jù)庫(kù)中重要的數(shù)據(jù)被泄露
- 安全環(huán)境的脆弱性
2.授權(quán):授予與收回
2.1.GRANT
grant <權(quán)限>,···
on <對(duì)象類型><對(duì)象名>碍沐,···
to <用戶>···
[with check option] //表示 被授權(quán)的用戶可以在授予其他用戶這些權(quán)限(繼續(xù)傳遞)
/* 把查詢student表的權(quán)限授予U1 */
grant select //還可以是 ALL PRIVILEGES 全部權(quán)限谎碍,UPDATE(Sno) 更新某列
on Table student
to U1
- 將對(duì)指定操作對(duì)象的指定操作權(quán)限授予指定的用戶
2.2.REVOKE
revoke <權(quán)限>莉兰,···
on <對(duì)象類型><對(duì)象名>扣猫,···
from <用戶>···[cascade|restrict] //默認(rèn):cascade 收回衍生權(quán)限
數(shù)據(jù)庫(kù)完整性
1.實(shí)體完整性
- 列級(jí)約束條件
- 表級(jí)約束條件
- 單屬性構(gòu)成時(shí)谷市,都可
- 多屬性構(gòu)成時(shí)柄驻,只能表級(jí)約束
create table stu
(
sno CHAR(9) PRIMARY KEY //列級(jí)約束定義
sname CHAR(20)
)
create table stu
(
sno CHAR(9)
sname CHAR(20)
PRIMARY KEY(sno) //表級(jí)約束條件
)
create table stu
(
sno CHAR(9)
sname CHAR(20)
PRIMARY KEY(sno,sname) //多值時(shí)表級(jí)約束胎挎,,P托汀段审!表明 主碼是(sno,sname)闹蒜,不是兩個(gè)分開
)
1.1.實(shí)體完整性檢查和違約處理
- 檢查主碼值是否唯一寺枉,不唯一則拒絕
- 檢查主碼的各個(gè)屬性是否為空,有空就拒絕
2.參照完整性
2.1.定義參照完整性
//主碼(sno,cno),sno為stu主碼绷落,cno為course主碼
create table sc
(
sno int not null,
cno int not null,
grade int,
PRIMARY KEY(sno,cno),
FOREIGN KEY(sno) references stu(sno),
FOREIGN KEY(cno) references coruse(cno),
)
3.用戶定義的完整性
3.1.屬性列上的約束條件
- 列值非空 not null
- 列值唯一 unique
- 列值是否滿足一個(gè)條件表達(dá)式 check
create table stu
( sno int not null姥闪,unique //not null.unique
ssex char(2) check(ssex in ('男','女')) //check
grade int check(grade > 0) //check
)
4.觸發(fā)器
create trigger <觸發(fā)器名> //觸發(fā)事件發(fā)生時(shí),觸發(fā)器激活
{before|after} <觸發(fā)事件> on <表名> //指明觸發(fā)器激活的時(shí)間嘱函,是在觸發(fā)事件前 或 后
REFERENCING NEW | OLD ROW AS<變量> //REFERENCING指出引用的變量
FOR EACH{ROW|STATEMENT} //定義觸發(fā)器類型甘畅,知名動(dòng)作體制性的頻率
[when<觸發(fā)條件>]<觸發(fā)動(dòng)作> //僅當(dāng)觸發(fā)條件為真時(shí)埂蕊,觸發(fā)動(dòng)作體
關(guān)系數(shù)據(jù)理論
1.問題的提出
- 1NF:每一個(gè)分量是不可分的數(shù)據(jù)項(xiàng)
- 數(shù)據(jù)依賴:關(guān)系內(nèi)部屬性與屬性之間的一種約束關(guān)系往弓。最重要的是 函數(shù)依賴FD 多值依賴MVD
- 關(guān)系模型常常會(huì)有四種問題
- 數(shù)據(jù)冗余
- 更新異常
- 插入異常
- 刪除異常
- 一個(gè)好的模式應(yīng)當(dāng)不會(huì)發(fā)生插入異常、刪除異常蓄氧、更新異常函似。數(shù)據(jù)冗余盡可能小
2.規(guī)范化
2.1.函數(shù)依賴
- 平凡函數(shù)依賴:X->Y,Y屬于X(不討論)
- 非平凡函數(shù)依賴:X->Y,Y不屬于X(以下均均為非平凡函數(shù)依賴)
- 決定因素:自變量,X
- 完全函數(shù)依賴:在某一關(guān)系模式下喉童,X->Y撇寞,對(duì)于X的任一真子集,都無(wú)法推導(dǎo)出Y
- 部分函數(shù)依賴:在某一關(guān)系模式下堂氯,X->Y蔑担,存在至少一個(gè)X的真子集,可以推導(dǎo)出Y
- 傳遞函數(shù)依賴:在某一關(guān)系模式下咽白,X->Y啤握,Y推不出X,Y->Z晶框,則X->Z
2.2.碼
- 候選碼:某一關(guān)系模式下排抬,某個(gè)屬性或?qū)傩越M合懂从,被完全函數(shù)依賴。即可稱為該關(guān)系的候選碼
- 超碼:某一關(guān)系模式下蹲蒲,某個(gè)屬性或?qū)傩越M合番甩,被部分函數(shù)依賴。即可稱為該關(guān)系的超碼
- 候選碼是一類特殊的超碼
- 主屬性:包含在任何一個(gè)候選碼中的屬性
- 非主屬性:不包含在任何一個(gè)候選碼中的屬性
- 全碼:整個(gè)屬性組是碼
- 外碼:某個(gè)屬性不是本關(guān)系的碼届搁,是其他關(guān)系模型的碼缘薛。
2.3.范式
- 規(guī)范化:一個(gè)低一級(jí)的范式關(guān)系模式通過模式分解轉(zhuǎn)換成高級(jí)范式關(guān)系模型的集合的過程
2.4.2NF
- R屬于1NF,且每個(gè)非主屬性完全依賴于任何一個(gè)候選碼咖祭,則R屬于2NF
- 2NF消除的是非主屬性對(duì)碼的部分函數(shù)依賴
2.4.3NF
- R屬于2NF掩宜,若R中不存在這樣的 碼X,屬性組Y么翰,非主屬性Z(Z不屬于Y)牺汤。使得X->Y,Y->Z成立浩嫌。則符合3NF
- 3NF消除非主屬性對(duì)碼的傳遞依賴
2.4.BCNF
- BCNF消除主屬性對(duì)碼的部份依賴和傳遞依賴
2.5.多值依賴
- 多值依賴:BCNF解決的問題都是函數(shù)范疇內(nèi)檐迟,但仍然存在數(shù)據(jù)冗余以及增刪改的不方便問題。
- 特性:
- 對(duì)稱性
- 傳遞性
- 函數(shù)依賴可以看作多值依賴的特殊情況
- 多值依賴的解決要靠4NF
3.數(shù)據(jù)依賴的公理系統(tǒng)(Armstrong)
- Armstrong公理系統(tǒng)的推理規(guī)則:
- 根據(jù)以上規(guī)則码耐,可以繼續(xù)推出:
- 合并規(guī)則:由X->Y追迟,X->Y,有X->YZ
- 偽傳遞規(guī)則:由X->Y骚腥,WY->Z敦间,有XW->Z
- 分解規(guī)則:由X->Y,Z屬于Y束铭,有X->Z
- Armstrong公理系統(tǒng)是有效的廓块,完備的
- 有效:由F觸發(fā)根據(jù)公里推導(dǎo)出來的每一個(gè)函數(shù)依賴一定在F+中
- 完備:F+中的每一個(gè)函數(shù)依賴,必定可以由F出發(fā)根據(jù)Armstrong公理推導(dǎo)出來
- 閉包問題
零碎:
1.存儲(chǔ)過程
- 優(yōu)點(diǎn):
- 存儲(chǔ)過程不像sql語(yǔ)句那樣再提出請(qǐng)求時(shí)才語(yǔ)法分析和優(yōu)化契沫,所以高效率
- 存儲(chǔ)過程降低了客戶機(jī)和服務(wù)器的通信量
- 方便實(shí)施企業(yè)規(guī)則
create or replace procedure <過程名>(參數(shù))
AS
<過程化sql塊>
2.事務(wù)
- 事務(wù):用戶定義的一個(gè)數(shù)據(jù)庫(kù)操作序列带猴,這些操作要么全做,要么全部做
- commit:提交事務(wù)
- rollback:回滾懈万,撤銷到事務(wù)開始階段
- 事務(wù)的特性:ACID
- 事務(wù)故障類型:
- 事務(wù)內(nèi)部故障:大多是非預(yù)期的拴清,不可由應(yīng)用程序處理
- 系統(tǒng)故障:指造成系統(tǒng)停止運(yùn)轉(zhuǎn)的任何事件,需要重新啟動(dòng)
- 介質(zhì)故障
- 計(jì)算機(jī)病毒
- 各類故障對(duì)數(shù)據(jù)庫(kù)的影響有兩種可能性
- 數(shù)據(jù)庫(kù)本身被破壞
- 數(shù)據(jù)異常
- 恢復(fù)的原理也很簡(jiǎn)單:冗余
3.日志
- 記錄事務(wù)對(duì)數(shù)據(jù)庫(kù)的更新操作文件会通,包括:
- 開始標(biāo)記
- 結(jié)束標(biāo)記
- 更新操作
- 登記日志文件口予,原則:
- 登記的次序嚴(yán)格按照并發(fā)事務(wù)執(zhí)行的時(shí)間次序
- 必須先寫日志文件,后寫數(shù)據(jù)庫(kù)
4.并發(fā)控制
- 交叉并發(fā)方式:在單處理機(jī)系統(tǒng)中涕侈,事物的并發(fā)執(zhí)行實(shí)際上是這些并行事務(wù)的并行操作輪流交叉運(yùn)行(實(shí)際還是串行)
- 同時(shí)并發(fā)方式:在多處理機(jī)系統(tǒng)中沪停,可以實(shí)現(xiàn)多個(gè)事務(wù)真正的并行運(yùn)行
- 事務(wù)是并發(fā)控制的基本單位
- 并發(fā)操作帶來的數(shù)據(jù)不一致保活:
- 丟師修改
- 不可重復(fù)讀
- 讀臟數(shù)據(jù)(讀到不正確的數(shù)據(jù))
- 以上錯(cuò)誤的原因:并發(fā)操作破壞了事務(wù)的隔離性
- 控制并發(fā)的主要技術(shù):
- 封鎖
- 時(shí)間戳
- 樂觀控制
- 多版本并發(fā)控制
- 可串行性 是并發(fā)事務(wù)正確性的準(zhǔn)則
封鎖
- 基本的封鎖類型:
- 只存在多事務(wù) 同時(shí)用S鎖對(duì)數(shù)據(jù)上鎖驾凶,是可以同時(shí)進(jìn)行牙甫,其他的組合方式都會(huì)被拒絕掷酗。
- 封鎖協(xié)議:在對(duì)數(shù)據(jù)對(duì)象加鎖時(shí),還需要規(guī)則窟哺,例如:
- 何時(shí)申請(qǐng)鎖
- 持鎖時(shí)間
- 何時(shí)釋放
- 封鎖協(xié)議的類型
- 一級(jí)封鎖協(xié)議
- 事務(wù)T在修改數(shù)據(jù)R之前必須對(duì)其加X鎖泻轰,直至事務(wù)結(jié)束才能釋放
- 一級(jí)封鎖協(xié)議可防止丟失修改,保證事務(wù)T是可恢復(fù)的
- 在一級(jí)封鎖協(xié)議中且轨,讀數(shù)據(jù)是不需要加鎖的浮声,所以她不能保證可重復(fù)讀,不讀臟數(shù)據(jù)
- 二級(jí)封鎖協(xié)議
- 在一級(jí)封鎖的基礎(chǔ)上增加事務(wù)T在讀取數(shù)據(jù)R之前必須加S鎖旋奢,讀完后釋放S鎖
- 防止讀臟
- 三級(jí)封鎖協(xié)議
- 在一級(jí)封鎖協(xié)議的基礎(chǔ)上增加事務(wù)T在讀取數(shù)據(jù)之前R必須先對(duì)其加S泳挥,事務(wù)結(jié)束再釋放
- 做到了防止重復(fù)讀
- 該三級(jí)協(xié)議的主要區(qū)別在于 什么時(shí)候申請(qǐng)封鎖,什么時(shí)候釋放鎖
活鎖
- 封鎖是可能導(dǎo)致產(chǎn)生操作系統(tǒng)中的異常狀態(tài)的
- 活鎖:某個(gè)事務(wù)的請(qǐng)求永遠(yuǎn)得不到處理至朗,資源被搶占
- 解決方法:采用FIFO
死鎖
- 死鎖:互相等待的狀況
- 死鎖預(yù)防:
- 一次封鎖法:要求每個(gè)事務(wù)必須一次將所有要用的數(shù)據(jù)全部加鎖
- 順序封鎖法:預(yù)先對(duì)數(shù)據(jù)對(duì)象規(guī)定一個(gè)封鎖順序屉符,所有事務(wù)都按這個(gè)順序?qū)嵤┓怄i
- 死鎖的診斷與解除
- 超時(shí)法:設(shè)定時(shí)長(zhǎng),解鎖
- 等待圖法:不可產(chǎn)生回路矗钟,即可解決