主頁 > 資料庫 > 【資料庫】總結

【資料庫】總結

2021-01-05 11:16:25 資料庫

第一章

概念模型(ER圖)

橢圓是屬性
矩形是物體
菱形為聯系

概念模型到關系模型轉化

主碼下面要加下劃線

1-m聯系

物體型->關系模式
將1端主碼連同聯系屬性放入n端屬性中

1-1聯系

物體型->關系模式
任意一端主碼連同聯系屬性放入到另外一端物體當中

n-m聯系

物體型->關系模式
產生一個新關系,關系名為聯系名,將兩端物體的主碼連同關系屬性

資料庫系統的三級模式結構

概念

資料庫的三級模式結構是由外模式、模式、內模式三級構成,
模式,也成邏輯模式,是資料庫中全體資料的邏輯結構和特征的描述,是所有用戶的公共資料視圖,一個資料庫只有一個模式,
外模式,也稱子模式或用戶模式,它是資料庫用戶能夠看見或使用的區域資料的邏輯結構和特征的描述,是資料庫用戶的資料視圖,是與某一應用有關的資料的邏輯表示,外模式通常是模式的子集,一個資料庫可以有多個外模式,
內模式,也稱存盤模式,一個資料庫只有一個內模式,它是資料物理結構和存盤方式描述,是資料在資料庫內部的組織方式,

優點

外模式使得資料庫安全性大大提高,
外模式/模式映像、模式/內模式映像使程式具有較高的邏輯獨立性和物理獨立性,使得資料定義和描述可以從應用程式中分離出去,另外,由于資料的存取由資料管理系統管理,從而簡化了應用程式的編制,大大減少了應用程式維護和修改,

資料庫第二章(關系資料庫)

關系完整性

物體完整性

若屬性(指一個或一組屬性)A是基本關系R的主屬性,則A不能取空值(null),

參照完整性

若屬性(或者屬性組)F是基本關系R的外碼,它與基本關系S的主碼Ks相對應(基本關系R和S不一定是不同的關系),則對于R中每個元組在F上的值必須
或者取空值
或者等于S中某個元組的主碼值

補充:外碼
設F是基本關系R的一個或一組屬性,但不是關系R的碼,Ks是基本關系S的主碼,如果F與Ks相對應,則稱F是R的外碼,并稱基本關系R為參照關系,基本關系S為被參照關系,關系R和關系S不一定是不同的關系,

用戶定義完整性

針對某一具體關系資料庫的約束條件,它反映某一具體應用所涉及的資料必須滿足的語意要求,如定義性別只能取男女,成績為0-100等,

關系代數

查詢至少選修1 號課程和3 號課程的學生號碼
查詢選修了2 號課程的學生的學號
查詢至少選修了一門其直接先行課為5 號課程的學生姓名
查詢選修全部課程的學生學號
求選修了1 號或2 號課程的學生號
檢索劉老師所授課程的課程號和課程名
檢索年齡大于23 歲的男學生的學號和姓名
檢索學號為S3 學生所學課程的課程名與任課教師名
檢索至少選修劉老師所授課程中一門課程的女學生姓名
檢索WANG 同學不學的課程的課程號
檢索至少選修兩門課的學生學號
檢索全部學生都選修的課程的課程號和課程名
檢索選修課程包含LIU 老師所授全部課程的學生學號

傳統的集合運算

  • R∪S={t|t∈R∨t∈S}
    t為元組變數

  • R-S={t|t∈R∧t?S}
    t為元組變數

  • R∧S={t|t∈R∧t∈S}
    t為元組變數

  • 笛卡爾積

    R×S={ts tr|tr∈R∧ts∈S }
    t為元組

專門的關系運算

  • 選擇
  • 投影
  • 連接

關系驗算語言

第三章

資料定義

模式定義

創建 create schema
洗掉 drop schema

表定義

創建 create table
洗掉 drop table
修改 alter table

創建學院表dept 學院號是主碼,學院名不可為空
create table dept
(
dno char(2),
dname char(20),
dtel char(10),
primary key(dno)
);

建立學生表,學號是主碼,姓名取值唯一,性別不能為空
create table student
(
sno char(10) primary key,
sname char(20) unique,
ssex char(2) not null,
foreign key(dno) references dept(dno)
);
洗掉表
DROP TABLE Student [restrict|cascade];

視圖

創建 create view
洗掉 drop view
詳見視圖部分

索引定義

創建 create index
洗掉 drop index
修改 alter index
建立索引的目的:加快查詢速度

create [unique][cluster]
index <索引名>
on <表名>
(<列名>[<次序>][,<列名>[<次序>]]…);
unique:唯一索引,每個索引項只對應唯一的記錄型別
cluster:聚簇索引,索引項的順序與表中記錄的物理順序一致的索引組織,

drop index<索引名>

資料更新

插入資料

插入時會檢查所插入的元組是否滿足完整性規則
物體完整性
參照完整性
用戶定義完整性
not null
unique
值域約束

  • 插入元組(插入一條記錄)

    格式:
    insert into<表名>[(<屬性列1>[,<屬性列2>…])]

    將一個新學生元組 ( 學號 :200215128 ;姓名 : 陳冬 ; 性別 : 男 ; 所在系 :CS ; 年齡 :18 歲) 插入到Student 表中 ,
    insert into s(sno,sname,ssex,sdept,sage)
    values(‘200215128’,‘陳東’,‘男’,‘cs’,18);

    對每一個系 , 求學生的平均年齡 , 并把結果存入資料庫
    create table dept_age
    (
    dept char(15) primary key,
    avg_age smallint
    );
    insert into dept_age(dept,avg_age)
    select sdept,avg(sage)
    from s
    group by sdept;

  • 插入子查詢結果(插入多條記錄)

修改資料

update <表名>
set <列名>=<運算式>[,<列名>=<運算式>…]
[where <條件>];

  • 修改某一個元組的值

    將學生200215121 的年齡改為22 歲
    update s
    set sage=22
    where sno=‘200215121’;

  • 修改多個元組的值

    所有教師工資上調5%
    update prof
    set sal =sal*1.05;

  • 帶有子查詢的修改陳述句

    將IS系全體學生成績清零
    update sc
    set grade=0
    where sno in(
    select sno from s
    where sdept=‘IS’
    );

    當某同學1號課的成績低于該課程平均成績時,將該同學該門課成績提高5%,
    update sc
    set grade=grade*1.05
    where cno=‘1’ and grade<(select avg(grade) from sc where cno=‘1’);

洗掉資料

  • 洗掉某一個元組的值

  • 洗掉多個元組的值

  • 帶子查詢的洗掉陳述句

    洗掉有四門不及格課程的所有同學資訊,
    delete from s
    where sno in (
    select sno from sc
    where grade<60
    group by sno
    having count(*)>=4
    );

視圖

虛表,是從一個或幾個基本表(或視圖)匯出的表
只存放視圖的定義,不存放視圖對應的資料
基表中的資料發生變化,從視圖中查詢出的資料也隨之改變

定義視圖

create view
<視圖名> [<列名>[,<列名>…]]
as <子查詢>
[with check option];

建立is系學生視圖
create view is_student
as
select sno,sname,sage
from s
where sdept=‘IS’;

建立IS 系學生的視圖 , 并要求進行修改和插
入操作時仍需保證該視圖只有IS
create view is_student
as
select sno,sname,sage
from s
where sdept=‘IS’
with check option;

with check option
如上題,更新時自動加上sdept=‘IS’

洗掉視圖
DROP VIEW < 視圖名>[CASCADE] ;
PS:cascade 是級聯

查詢視圖

更新視圖

視圖的作用

視圖能夠簡化用戶的操作
視圖使用戶能以多種角度看待同一資料
視圖對重構資料庫提供了一定程度的邏輯獨立性
視圖能夠對機密資料提供安全保護
適當的利用視圖可以更清晰的表達查詢

嵌入式sql

database.cpp

資料查詢

單表查詢

選擇表中若干列
  • select 后面列出目標列運算式

  • 目標列運算式

    • 算術運算式
    • 字串常量
    • 函式(count, sum, avg, min, max)
    • 列別名(可使用列別名改變查詢結果的列標題)
選擇表中若干元組
  • 查詢結果可能出現重復元組,通過distinct去重

  • 常用的查詢條件

    • 比較(=, >, <. >=, <=, !=, <>)

    • 確定范圍(between and, not between and)

    • 確定集合(in, not in)

      select sname,ssex
      from s
      where sdept in(“CS”, “MA”,“IS”)

    • 字符匹配(like, not like)

      • [not] like ‘匹配串’ escape ‘換碼字符’
      • %匹配0個及以上任意字符, _匹配任意單個字符
    • 多重條件(and, or, not)

  • 涉及空值的查詢

    選修1號課的不及格的學生及缺考的學生學號,
    select sno from sc
    where cno=‘1’ and grade<60
    union
    select sno from sc
    where cno=‘1’ and grade is null

order by 子句

按照系好升序列出老師姓名,所在系別,同一系中老師按姓名降序排序,
select pname,dno
from prof
order by dno, pname desc;

  • 升序 asc (默認) 降序 desc
聚集函式
  • 計數 count(* | [distinct | alll] <列名>)
  • 計算總和 sum([distinct | all] <列名>)
  • 計算平均值 avg([distinct | all] <列名>)
  • 最大最小值 max([distinct | all] <列名>) min([distinct | all] <列名>)
group by 子句
  • 結合聚集函式
  • having陳述句進行對分組篩選(組為單位) where對記錄進行篩選(記錄為單位),先進行where再進行having

連接查詢

等值與非等值連接查詢

例題:查詢 每個學生及其選修課程的情況
select s.,sc.
from s,sc
where s.sno=sc.sno
自然連接
查詢每個學生及其選修課程的情況,用自然連接完成
select s.sno, sname,sage,ssex,sdept,cno,grade
from s,sc
where s.sno=sc.sno

自身連接

例題:查詢每一門課的間接選修課(先修課的先修課)
select first.cno,second.pno
from sc first,sc second
where first.pno=second.cno

外連接

查詢每個學生及其選修課程的情況
select s.sno,sname,ssex,sage,cno,grade
from s left outer join sc on(s.sno=sc.sno)

  • 左外連接

    左邊關系中的任何元組t都會出現在結果表中
    格式:
    R left outer join S on(R.c=S.c)

  • 右外連接

    右邊關系的任何元組t都會出現在結果表中
    格式:
    R right outer join S on(R.c=S.c)

  • 全外連接

    是前兩者的并
    格式:
    R full outer join S on(R.c=S.c)

復合條件連接

WHERE子句中含多個連接條件和限定

  1. 查詢選修2號課程且成績在90分以上的所有學生的學號和姓名
    select s.sno,sname
    from s,sc
    where s.sno=sc.sno
    and sc.cno=‘2’
    and sc.grade>90

  2. 選出既學過1號課程,又學過2號課程的學生學號
    select sno
    from sc sc1,sc sc2
    where sc1.sno=sc2.sno
    and sc1.cno=‘1’
    and sc2.cno=‘2’

嵌套查詢

一個SELECT-FROM-WHERE 陳述句稱為一個查詢塊
將一個查詢塊嵌套在另一個查詢塊的WHERE 子句或HAVING 短語的條件中的查詢稱為嵌套查詢
子查詢的限制:不能使用order by子句
有些嵌套查詢可以用連接查詢代替

帶有in謂詞的子查詢

查詢與 “ 劉晨 ” 在同一個系學習的學生姓名
select sname
from s s1
where s1.sdept in(
select sdept from s s2
where s2.sname=‘劉晨’
);
ps:該查詢是不相關子查詢,s1 s2可以省略

查詢選修了課程名為 “ 資訊系統 ” 的學生學號
和姓名
select s.sno,sname
from s,sc
where s.sno=sc.sno and sc.cno in (
select cno from c
where c.cname=‘資訊系統’
);
這種情況是1對1的 用連接查詢比較方便
select s.sno,sname
from s,sc,c
where s.sno=sc.sno and sc.cno=c.cno and c.cname=‘資訊系統’;

求兩門課以上不及格課程學號以及其平均成績
select sno,avg(grade)
from sc
where sc.sno in (
select sno from sc
where grade < 60
group by sno
having count(*)>2
)
group by sno

列出沒學過編譯原理課程的所有同學姓名
select sname
from s
where sno not in (
select sno from sc,c
where sc.cno=c.cno and cname=‘編譯原理’
);

帶有比較運算子的子查詢

子查詢一定要跟在比較符之后,當確切知道內層查詢回傳單值時,可用比較運算子(>,<,<=,>=,!=或者<>)

找出每個學生超過他選修課程平均成績的
課程號 ,
select sno,cno
from sc sc1
where sc1.grade>(
select avg(grade)
from sc sc2
where sc2.cno=sc1.cno
)

帶有any(some)或all謂詞的子查詢

ANY 大于子查詢結果中的某個值
ALL 大于子查詢結果中的所有值
< ANY 小于子查詢結果中的某個值
< ALL 小于子查詢結果中的所有值
= ANY 大于等于子查詢結果中的某個值
= ALL 大于等于子查詢結果中的所有值
<= ANY 小于等于子查詢結果中的某個值
<= ALL 小于等于子查詢結果中的所有值
= ANY 等于子查詢結果中的某個值
=ALL 等于子查詢結果中的所有值(無意義)
!=(或<>)ANY 不等于子查詢結果中的某個值
!=(或<>)ALL 不等于子查詢結果中的任何一個值

  • any 任意一個值
  • all 所有值
帶有exists謂詞的子查詢

查詢所有選修了1 號課程的學生姓名
select sname
from s
where exists(
select * from sc
where sc.cno=‘1’ and sc.sno=s.sno
)

查詢與 “ 劉晨 ” 在同一個系學習的學生姓名
select sname
from s s1
where exists(
select * from s s2
where s2.sdept=s1.sdept and s2.sname=‘劉晨’
)

查詢選修了全部課程的學生姓名 (沒有一門課程是他不選修的),
select sname
from s
where not exists(
select * from sc where not exists(
select * from c
where c.cno=sc.cno and s.sno=sc.sno
)
)

集合查詢

參加集合操作的個查詢結果的列數必相同;
對應項的資料型別也必須相同

并操作(union)
交操作(intersect)
差操作(except)

基于派生表的查詢

from (SELECT Sno FROM SC WHERE Cno=’ 1 ') as sc1

第五章、關系資料理論

函式之間依賴關系

完全函式依賴(好的依賴關系)

部分函式依賴

傳遞函式依賴

判斷范式

1NF

一個關系模式所以屬性都是不可分的資料項

2NF

R∈1NF,且每一個非主屬性完全函式依賴于任何一個候選碼,則R∈2NF

3NF

設關系模式R<U,F>∈1NF,若R中不存在這樣的碼X,屬性組Y及非主屬性Z(Z不是Y子集)使得X->Y,Y->Z成立,Y ->X,則稱R<U,F>∈3NF

BCNF

關系模式R<U,F>∈1NF,若X->Y且Y不是X子集時,X必含有碼,則R<U,F>∈BCNF

證明

  • 若R為3NF,證明其為2NF
  • 若R是BCNF,證明其為3NF

模式分解

原則:消除不合理依賴,保留好的依賴,保持無損連接,

1NF -> 2NF

消除非主屬性對碼的部分函式依賴

2NF -> 3NF

消除非主屬性對碼的傳遞函式依賴

3NF -> BCNF

消除主屬性對碼的部分和傳遞函式依賴

屬性集閉包計算及公理系統

屬性集閉包計算:
已知關系模式R<U,F>,其中,
U={A,B,C,D,E}
F={AB->C,B->D,C->E,EC->B,AC->B}
求(AB)_F^+

資料庫設計

需求分析

了解與分析用戶需求(包括資料和處理),是最為繁瑣的一步,

概念結構設計

通過對用戶需求進行綜合,歸納和抽象,形成一個獨立與具體資料庫管理系統的概念模型(如er圖),

邏輯結構設計

將概念結構轉化為某個資料庫管理系統所支持的資料模型,并對其進行優化,

資料庫物理設計

為邏輯資料模型選取一個最適合應用環境的物理結構(包括存盤結構和存取方法),

資料庫實施

設計人員運用資料庫管理系統提供的資料庫語言及其宿主語言,根據邏輯設計和物理設計的結果建立資料庫,撰寫與除錯應用程式,組織資料入庫,并進行試運行,

資料庫運行與維護

資料庫應用系統經過試運行后即可投入正式運行,在資料庫系統運行程序中必須不斷的對其進行評估,調整和修改,

第七章、資料庫恢復

事物:事務(Transaction)是用戶定義的一個資料庫操作序列,這些操作要么全做,要么全不做,是一個不可分割的作業單位,

BEGIN TRANSACTION;
COMMIT;
ROLLBACK;
事務通常是以begin transaction開始,以commit或者rollback結束,
commit:表示提交,及提交事務的所有操作,
rollback:表示回滾,事務運行程序中出現了某種故障,事務不能正常執行,系統將事務中對資料庫所有已完成的操作全部撤銷,

事務四個特性:原子性、一致性、隔離性、持續性,

故障種類

事務故障

某個事務在運行程序中由于種種原因未運行至正常終止點就夭折了,

– 輸入資料有誤
– 運算溢位
– 違反了某些完整性限制
– 某些應用程式出錯
– 并行事務發生死鎖

系統故障

系統故障是指造成系統停止運轉的任何事件,使得系統要重新啟動,

– 整個系統的正常運行突然被破壞
– 所有正在運行的事務都 非正常終止
– 記憶體中 資料庫緩沖區的資訊全部丟失
– 外部存盤設備上的資料未受影響

介質故障

介質故障是指存盤資料庫的設備( 如硬碟) 發生故障,使存盤在其上的資料部分丟失或全部丟失,

磁盤損壞、
磁頭碰撞、
作業系統的某種潛在錯誤
瞬時強磁場干擾,

恢復實作技術

資料轉儲(備份)

資料庫管理員定期地將整個資料庫復制到磁帶,磁盤或者其他存盤介質上保存起來的程序,

資料庫轉儲還可分為兩個方式:海量轉儲(每次轉儲全部資料庫)和增量轉儲(每次只轉儲上一次轉儲后更新的資料),其和兩種轉儲狀態可兩兩組合,

  • 靜態轉儲

    在系統無運行事務時進行的轉儲操作,

    在轉儲操作開始的時刻資料庫處于一致性狀態,而轉儲期間不允許(或不存在)對資料庫的任何存取、修改活動,

  • 動態轉儲

    是指轉儲期間允許對資料庫進行存取或修改,

    必須把轉儲期間各事務對資料庫的修改活動登記下來,建立日志檔案,

日志檔案

  • 日志檔案的格式和內容

    是用來記錄事務對資料庫的更新操作的檔案,

    • 以記錄為單位

      各個事務的開始標記(BEGIN TRANSACTION)
      各個事務的結束標記(COMMIT 或ROLLBACK)
      各個事務的所有更新操作
      這三個構成日志檔案中的一個日志記錄,

      每個日志記錄內容

      1. 事務標識
      2. 操作型別(插入、洗掉或修改)
      3. 操作物件
      4. 更新前資料的舊值(對插入操作而言,此項為空值)
      5. 更新后資料的新值(對洗掉操作而言, 此項為空值)
    • 以資料塊為單位

      – 事務標識
      – 更新前的資料塊(對插入操作而言,此項為空值)
      – 更新后的資料塊(對洗掉操作而言, 此項為空值)

  • 日志檔案的作用

    • 進行事務故障恢復
    • 進行系統故障恢復
    • 介質故障恢復(協助后備副本進行)
  • 登記日志檔案

    • 登記次序嚴格按照并發事務執行的時間次序

    • 先寫日記檔案,后寫資料庫

      原因:
      – 寫資料庫和寫日志檔案是兩個不同的操作;
      – 在這兩個操作之間可能發生故障,
      – 如果先寫了資料庫修改,而在日志檔案中沒有記登
      這個修改,則以后就無法恢復這個修改了;
      – 如果先寫日志,但沒有修改資料庫, 按日志檔案恢
      復時,只不過是多執行一次不必要的UNDO 操作,并
      不會影響資料庫的正確性,

具有檢查點的恢復技術

  1. 從重新開始檔案中找到最后一個檢查點記錄在日志檔案中的地址,由該地址在日志檔案中找到最后一個檢查點記錄;
  2. 由該檢查點記錄得到檢查點建立時刻所有正在執行的事單務清單ACTIVE-LIST ,建立兩個事務佇列
    – UNDO-LIST
    – REDO-LIST
    把首先把ACTIVE-LIST 暫時放入UNDO-LIST 佇列,REDO佇列暫為空,
  3. 從檢查點開始正向掃描日志檔案,直到日志檔案結束
    – 如有新開始的事務Ti, 把Ti 暫時放入UNDO-LIST 佇列
    – 如有提交的事務Tj ,把Tj 從UNDO-LIST 佇列移到REDO-LIST 佇列
  4. 對UNDO-LIST 中的每個事務執行UNDO 操作, 對REDO-
    LIST 中的每個事務執行REDO

恢復策略

事務故障的恢復

(a) 反向掃描檔案日志(即從最后向前掃描日志檔案),查找該事務的更新操作,
(b) 對該事務的更新操作執行逆操作,即將日志記錄中 “ 更新前的值 ” 寫入資料庫,
插入操作, “ 更新前的值 ” 為空,則相當于做洗掉操作
洗掉操作, “ 更新后的值 ” 為空,則相當于做插入操作
修改操作,則用 “ 更新前的值 ”代替"更新后的值"
? 繼續反向掃描日志檔案,查找該事務的其他更新操作,并做同樣處理,
(d) 如此處理下去,直至讀到此事務的開始標記,事務故障恢復就完成了,

系統故障的恢復

總:撤銷故障發生時未完成的事務,重做已完成的事務,

  1. 正向掃描日志檔案(即從頭掃描日志檔案),生成如下兩個佇列,
    Redo 佇列: 在故障發生前已經提交的事務
    Undo 佇列: 故障發生時尚未完成的事務

  2. 對Undo 佇列事務進行Undo處理:
    反向掃描日志檔案,對每個Undo事務的更新操作執行逆操作,即將 “ 更新前的值 ” 寫入資料庫,(回滾)

  3. 對Redo 佇列事務進行REDO 處理:
    正向掃描日志檔案,對每個REDO 事務重新執行日志檔案登記的操作,即將 “ 更新后的值 ” 寫入資料庫,(重做)

介質故障的恢復

  1. 重裝資料庫
    裝入最新的后備資料庫副本,使資料庫恢復到最近一
    次轉儲時的一致性狀態,
  2. 重做已完成事務
    裝入有關的日志檔案副本(轉儲結束時刻的日
    志檔案副本),重做已完成的事務,

第八章、并發控制

事務并發執行帶來的問題

會帶來資料不一致性

丟失修改

丟失修改是指事務1與事務2從資料庫中讀入同一資料并修改,事
務2的提交結果破壞了事務1提交的結果,導致事務1 的修改被丟失,

不可重復讀

不可重復讀是指事務1讀取資料后,事務2執行更新操作,使事務1無法再現前一次讀取結果 ,

  • 修改

    事務1 讀取某一資料后:事務2對其做了修改, 當事務1再次讀該資料時,得到與前一次不同的值,

  • 洗掉

    事務2洗掉了其中部分記錄 ,當事務1 再次讀取資料時,發現某些記錄神秘地消失了,

  • 插入

    事務2 插入了一些記錄 ,當事務1 再次按相同條件讀取資料時,
    發現多了一些記錄,

讀臟資料

事務1修改某一資料,并將其寫回磁盤,事務2讀取同一資料后 讀取同一資料后,事務1由于某種原因被撤消 ,這時事務1已修改過的資料恢復原值,事務2讀到的資料就與資料庫中的資料不同,是不正確的資料,又稱為 “ 臟 ” 資料 ,

封鎖

封鎖就是事務T 在對某個資料物件(例如表、記錄等)操作之前,先向系統發出請求,對其加鎖,
加鎖后事務T 就對該資料物件有了一定的控制,在事務T釋放它的鎖之前,其它的事務不能更新此資料物件,

基本封鎖型別

  • 共享鎖(s鎖,又稱為讀鎖)

    若事務T對資料物件A加上S鎖,則其它事務只能再對A加S鎖,而不能加X鎖,直到T釋放A上的S鎖,

  • 排它鎖(X鎖,又稱為寫鎖)

    若事務T對資料物件A 加上X 鎖,則只允許T讀取改和修改A,其它任何事務都不能再對A加任何型別的鎖,直到T釋放A上的鎖,

封鎖協議

  • 一級封鎖協議

    事務T在修改資料R之前必須先對其加X鎖,直到事務結束(commit或rollback)才釋放,

    可防止丟失修改

    如果是讀資料,不需要加鎖的,所以它不能保證可重復讀和不讀“臟”資料,

  • 二級封鎖協議

    1級封鎖協議+ 事務T在讀取資料R前必須加先加S鎖,讀完后即可釋放S鎖,

    2級封鎖協議可以防止丟失修改和讀“臟”資料,

    由于讀完資料后即可釋放S 鎖,所以它不能保證可重復讀,

  • 三級封鎖協議

    1 級封鎖協議+事務T在讀取資料R之前必須先對其加S鎖,直到事務結束才釋放,

    3級封鎖協議可以防止丟失修改和讀“臟”資料和不可重復讀,

活鎖和死鎖

活鎖

由于系統調度原因,某些事物的加鎖請求得不到回應而永遠等待,

策略:可采用先到先服務的策略,

死鎖

兩個或多個事務都已封鎖了一些資料物件,然后又都請求對已被其他事務封鎖的資料物件加鎖,從而出現死等待,

  • 死鎖的預防

    這兩種策略并不太適合資料庫的特點,因此采用診斷并解除的方法,

    • 一次封鎖法

      要求每個事務必須一次將所有要使用的資料全部加鎖,否則就不能繼續執行 ,

      難于事先精確確定封鎖物件
      降低并發度

    • 順序封鎖法

      順序封鎖法是預先對資料物件規定一個封鎖順序,所有事務都按這個順序實行封鎖,

      維護成本高
      難于實作

  • 死鎖的診斷和解除

    • 診斷

      • 超時法

        如果一個事務的等待時間超過了規定的時限,就認為發生了死鎖,

        實作簡單

        1. 若時限設定過短,有可能誤判死鎖
        2. 若時限設定過長,容易發現不到死鎖,
      • 等待圖法

        用事務等待圖動態反映所有事務的等待情況,并發控制子系統周期性地生成事務等待圖,并進行檢測,

    • 解除

      選擇一個處理死鎖代價最小的事務,將其撤消,釋放此事務持有的所有的鎖,使其它事務能繼續運行下去,

并發操作的可串行性

將所有事務串行起來的調度策略一定是正確的調度策略,

多個事務的并行執行是正確的, 當且僅當其結果與按某一次序串行地執行它們時的結果相同,這種并行調度策略稱為可串行化的調度,

兩段鎖協議

事務分為兩個階段

并行執行的所有事務均遵守兩段鎖協議,則對這些事務的所有并行調度策略都是可串行化的,

  1. 一次封鎖法要求每個事務必須一次將所有要使用的資料全部加鎖,否則就不能繼續執行,因此,一次封鎖法遵守兩段鎖協議;
  2. 但是兩段鎖協議并不要求事務必須一次將所有要使用的資料全部加鎖,因此,遵守兩段鎖協議的事務可能發生死鎖,

擴展階段

第一階段獲得鎖,也稱為擴展階段,在這個階段,事務可以申請獲得資料項任何型別鎖,但是不能釋放任何鎖,

收縮階段

第二階段釋放鎖,也稱為收縮階段,在這個階段,事務可以釋放資料項任何型別鎖,但是不能申請任何鎖,

第九章、資料庫安全性

保護資料庫以防止不合法使用所造成的的資料泄露,更改或破壞,

其他的還有
用戶層面:用戶標記(用戶身份鑒別)
硬碟層面:密碼方式存盤
視圖(把要保密的資料隱藏起來)

存取控制

存取控制機制

  • 定義用戶權限

    定義用戶權限,并將用戶權限登記到資料字典中,

  • 合法權限檢查

    根據安全性規則進行安全性檢查,若用戶請求超出了定義的權限,則系統拒絕操作,

兩種存取控制方法

  • 自主存取控制

    用戶對于不同的資料庫物件有不同的存取權限,
    不同用戶對同一物件也有不同的權限,
    用戶還可將其擁有的存取權限轉授給其他用戶,

    • 授權:授予

      grant <權限>[,<權限>]…
      on <物件型別> <物件名>[,<物件型別><物件名>]…
      to <用戶>[,<用戶>]…
      [with grant option]

      WITH GRANT OPTION子句:
      指定:可以再授予
      沒有指定:不能傳播

      (1) 把查詢Student表權限授給用戶U1
      GRANT SELECT
      ON TABLE Student
      TO U1;
      (2) 把對Student表和Course表的全部權限授予用戶U2和U3
      GRANT ALL PRIVILIGES
      ON TABLE Student, Course
      TO U2, U3;
      (3) 把對表SC的查詢權限授予所有用戶
      GRANT SELECT
      ON TABLE SC
      TO PUBLIC;
      (4) 把查詢Student表和修改學生學號的權限授給用戶U4
      GRANT UPDATE(Sno), SELECT
      ON TABLE Student
      TO U4;

    • 授權:識訓

      REVOKE <權限>[,<權限>]…
      ON <物件型別> <物件名>,…
      FROM <用戶>[,<用戶>]
      [CASCADE|RESTRICT];

      cascade:級聯識訓 系統只識訓直接或間接從U5處獲得的權限

  • 強制存取控制

    每個資料庫物件被標記以一定的密級,每一個用戶也被授予某一個密級的許可證,對于任意一個物件,只有具有合法許可證的用戶才可以存取,

    • 主體與客體

      主體:是系統中的活動物體,既包括資料庫管理系統所管理的實際用戶,也代表用戶的各個行程,
      客體:是系統中的被動物體,是受主題操縱的,包括檔案、基本表、索引、視圖等,

    • 規則

      當主體許可證級別大于等于客體密級時,該主體才能讀取回應的客體
      當主體許可證級別小于等于客體密級時,該主體才能寫相應的客體,

審計

將用戶對資料庫的所有操作自動記錄下來,放入到審計檔案中,

設定審計功能 (AUDIT)

對修改SC表結構或修改SC表資料的操作進行審計
AUDIT ALTER,UPDATE
ON SC;

取消審計功能 (NOAUDIT)

取消對SC表的一切審計
NOAUDIT ALTER,UPDATE
ON SC;

第十章、資料庫完整性

資料庫完整性是指資料的正確性和相容性,
正確性:資料是符合現實世界語意反應當前實際狀況的;
相容性:資料庫同一物件在不同關系表中的資料是符合邏輯的,

物體完整性

檢查與違約處理

檢查主碼值是否唯一,如果不唯一則拒絕插
入或修改
檢查主碼的各個屬性是否為空,只要有一個
為空就拒絕插入或修改

參照完整性

CREATE TABLE SC
(Sno CHAR(9) NOT NULL, ,
Cno CHAR(4) NOT NULL, ,
Grade SMALLINT, ,
PRIMARY KEY (Sno ,Cno ),
FOREIGN KEY (Sno) REFERENCES Student(Sno)
ON DELETE CASCADE /* 級聯洗掉SC 表中相應的元組*/
ON UPDATE CASCADE, /* 級聯更新 新SC 表中相應的元組 組*/
FOREIGN KEY (Cno) REFERENCES Course(Cno)
ON DELETE NO ACTION /* 當洗掉course 表中的元
組造成了與SC 表不一致 時 拒絕洗掉*/
ON UPDATE CASCADE /* 當更新course 表中的cno時 時 , 級
聯更新SC 表中相應的元組*/);

違約處理

拒絕(NO ACTION)執行(默認策略)
級聯(CASCADE)操作
設定為空值(SET-NULL)

用戶定義完整性

不滿足則拒絕執行

屬性上約束條件

不滿足則拒絕執行

  • 不允許空值 not null
  • 列值唯一 unique
  • 用check陳述句設定 如ssex值允許取’男’和’女’ check( ssex in(‘男’,‘女’))

元組上約束條件

最后加check

當學生的性別是男時,其名字不能以Ms.打頭,
CREATE TABLE Student
(Sno CHAR(9),
Sname CHAR(8) NOT NULL,
Ssex CHAR(2),
Sage SMALLINT,
Sdept CHAR(20),
PRIMARY KEY (Sno),
CHECK (Ssex=‘女’ OR Sname NOT LIKE’Ms.%’)
/定義了元組中Sname和 Ssex兩個屬性值之間
的約束條件
/
);

觸發器

觸發器(Trigger)是用戶定義在關系表上的一類由事件驅動的特殊程序,

定義觸發器

  • 定義陳述句

    create trigger <觸發器名>
    {before|after} 觸發事件 on <表名>
    referencing new|old row as<變數>
    for each {row|statement}
    begin
    執行 內容
    end

    • 例題

      【1】當洗掉某一同學Sno時,該同學所有選課也要洗掉,請用觸發器實作,
      create trigger dels
      after delete on s
      referencing old oldi
      for each row
      begin
      delete from sc where sno=oldi.sno
      end;

      【2】對sc表的grade屬性進行修改時,若分數增加了10%,則將此操作記錄到另一表sc_u(sno,cno,oldgrade,newgrade)中,
      create trigger sc_t
      after update of grade on sc
      referencing
      oldrow as oldtuple
      newrow as newtuple
      for each row
      when(newtuple.grade>=1.1*oldtuple.grade)
      insert into sc_u(sno,cno,oldgrade,newgrade)
      values(oldtulpe.sno,oldtuple.cno,oldtuple.grade,
      newtuple.grade)

激活觸發器

    1. 執行該表上的before觸發器
    1. 激活該觸發器對應的sql陳述句
    1. 執行該表上的after觸發器

洗掉觸發器

觸發器必須是已經創建的觸發器
只能由具有相應權限的用戶洗掉
PS:只有表的擁有者能創建觸發器

  • drop trigger <觸發器名> on <表名>;

轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/244738.html

標籤:其他

上一篇:linux系統安裝并配置oracle客戶端

下一篇:資料庫基本操作

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • GPU虛擬機創建時間深度優化

    **?桔妹導讀:**GPU虛擬機實體創建速度慢是公有云面臨的普遍問題,由于通常情況下創建虛擬機屬于低頻操作而未引起業界的重視,實際生產中還是存在對GPU實體創建時間有苛刻要求的業務場景。本文將介紹滴滴云在解決該問題時的思路、方法、并展示最終的優化成果。 從公有云服務商那里購買過虛擬主機的資深用戶,一 ......

    uj5u.com 2020-09-10 06:09:13 more
  • 可編程網卡芯片在滴滴云網路的應用實踐

    **?桔妹導讀:**隨著云規模不斷擴大以及業務層面對延遲、帶寬的要求越來越高,采用DPDK 加速網路報文處理的方式在橫向縱向擴展都出現了局限性。可編程芯片成為業界熱點。本文主要講述了可編程網卡芯片在滴滴云網路中的應用實踐,遇到的問題、帶來的收益以及開源社區貢獻。 #1. 資料中心面臨的問題 隨著滴滴 ......

    uj5u.com 2020-09-10 06:10:21 more
  • 滴滴資料通道服務演進之路

    **?桔妹導讀:**滴滴資料通道引擎承載著全公司的資料同步,為下游實時和離線場景提供了必不可少的源資料。隨著任務量的不斷增加,資料通道的整體架構也隨之發生改變。本文介紹了滴滴資料通道的發展歷程,遇到的問題以及今后的規劃。 #1. 背景 資料,對于任何一家互聯網公司來說都是非常重要的資產,公司的大資料 ......

    uj5u.com 2020-09-10 06:11:05 more
  • 滴滴AI Labs斬獲國際機器翻譯大賽中譯英方向世界第三

    **桔妹導讀:**深耕人工智能領域,致力于探索AI讓出行更美好的滴滴AI Labs再次斬獲國際大獎,這次獲獎的專案是什么呢?一起來看看詳細報道吧! 近日,由國際計算語言學協會ACL(The Association for Computational Linguistics)舉辦的世界最具影響力的機器 ......

    uj5u.com 2020-09-10 06:11:29 more
  • MPP (Massively Parallel Processing)大規模并行處理

    1、什么是mpp? MPP (Massively Parallel Processing),即大規模并行處理,在資料庫非共享集群中,每個節點都有獨立的磁盤存盤系統和記憶體系統,業務資料根據資料庫模型和應用特點劃分到各個節點上,每臺資料節點通過專用網路或者商業通用網路互相連接,彼此協同計算,作為整體提供 ......

    uj5u.com 2020-09-10 06:11:41 more
  • 滴滴資料倉庫指標體系建設實踐

    **桔妹導讀:**指標體系是什么?如何使用OSM模型和AARRR模型搭建指標體系?如何統一流程、規范化、工具化管理指標體系?本文會對建設的方法論結合滴滴資料指標體系建設實踐進行解答分析。 #1. 什么是指標體系 ##1.1 指標體系定義 指標體系是將零散單點的具有相互聯系的指標,系統化的組織起來,通 ......

    uj5u.com 2020-09-10 06:12:52 more
  • 單表千萬行資料庫 LIKE 搜索優化手記

    我們經常在資料庫中使用 LIKE 運算子來完成對資料的模糊搜索,LIKE 運算子用于在 WHERE 子句中搜索列中的指定模式。 如果需要查找客戶表中所有姓氏是“張”的資料,可以使用下面的 SQL 陳述句: SELECT * FROM Customer WHERE Name LIKE '張%' 如果需要 ......

    uj5u.com 2020-09-10 06:13:25 more
  • 滴滴Ceph分布式存盤系統優化之鎖優化

    **桔妹導讀:**Ceph是國際知名的開源分布式存盤系統,在工業界和學術界都有著重要的影響。Ceph的架構和演算法設計發表在國際系統領域頂級會議OSDI、SOSP、SC等上。Ceph社區得到Red Hat、SUSE、Intel等大公司的大力支持。Ceph是國際云計算領域應用最廣泛的開源分布式存盤系統, ......

    uj5u.com 2020-09-10 06:14:51 more
  • es~通過ElasticsearchTemplate進行聚合~嵌套聚合

    之前寫過《es~通過ElasticsearchTemplate進行聚合操作》的文章,這一次主要寫一個嵌套的聚合,例如先對sex集合,再對desc聚合,最后再對age求和,共三層嵌套。 Aggregations的部分特性類似于SQL語言中的group by,avg,sum等函式,Aggregation ......

    uj5u.com 2020-09-10 06:14:59 more
  • 爬蟲日志監控 -- Elastc Stack(ELK)部署

    傻瓜式部署,只需替換IP與用戶 導讀: 現ELK四大組件分別為:Elasticsearch(核心)、logstash(處理)、filebeat(采集)、kibana(可視化) 下載均在https://www.elastic.co/cn/downloads/下tar包,各組件版本最好一致,配合fdm會 ......

    uj5u.com 2020-09-10 06:15:05 more
最新发布
  • day02-2-商鋪查詢快取

    功能02-商鋪查詢快取 3.商鋪詳情快取查詢 3.1什么是快取? 快取就是資料交換的緩沖區(稱作Cache),是存盤資料的臨時地方,一般讀寫性能較高。 快取的作用: 降低后端負載 提高讀寫效率,降低回應時間 快取的成本: 資料一致性成本 代碼維護成本 運維成本 3.2需求說明 如下,當我們點擊商店詳 ......

    uj5u.com 2023-04-20 08:33:24 more
  • MySQL中binlog備份腳本分享

    關于MySQL的二進制日志(binlog),我們都知道二進制日志(binlog)非常重要,尤其當你需要point to point災難恢復的時侯,所以我們要對其進行備份。關于二進制日志(binlog)的備份,可以基于flush logs方式先切換binlog,然后拷貝&壓縮到到遠程服務器或本地服務器 ......

    uj5u.com 2023-04-20 08:28:06 more
  • day02-短信登錄

    功能實作02 2.功能01-短信登錄 2.1基于Session實作登錄 2.1.1思路分析 2.1.2代碼實作 2.1.2.1發送短信驗證碼 發送短信驗證碼: 發送驗證碼的介面為:http://127.0.0.1:8080/api/user/code?phone=xxxxx<手機號> 請求方式:PO ......

    uj5u.com 2023-04-20 08:27:27 more
  • 快取與資料庫雙寫一致性幾種策略分析

    本文將對幾種快取與資料庫保證資料一致性的使用方式進行分析。為保證高并發性能,以下分析場景不考慮執行的原子性及加鎖等強一致性要求的場景,僅追求最終一致性。 ......

    uj5u.com 2023-04-20 08:26:48 more
  • sql陳述句優化

    問題查找及措施 問題查找 需要找到具體的代碼,對其進行一對一優化,而非一直把關注點放在服務器和sql平臺 降低簡化每個事務中處理的問題,盡量不要讓一個事務拖太長的時間 例如檔案上傳時,應將檔案上傳這一步放在事務外面 微軟建議 4.啟動sql定時執行計劃 怎么啟動sqlserver代理服務-百度經驗 ......

    uj5u.com 2023-04-20 08:26:35 more
  • 云時代,MySQL到ClickHouse資料同步產品對比推薦

    ClickHouse 在執行分析查詢時的速度優勢很好的彌補了MySQL的不足,但是對于很多開發者和DBA來說,如何將MySQL穩定、高效、簡單的同步到 ClickHouse 卻很困難。本文對比了 NineData、MaterializeMySQL(ClickHouse自帶)、Bifrost 三款產品... ......

    uj5u.com 2023-04-20 08:26:29 more
  • sql陳述句優化

    問題查找及措施 問題查找 需要找到具體的代碼,對其進行一對一優化,而非一直把關注點放在服務器和sql平臺 降低簡化每個事務中處理的問題,盡量不要讓一個事務拖太長的時間 例如檔案上傳時,應將檔案上傳這一步放在事務外面 微軟建議 4.啟動sql定時執行計劃 怎么啟動sqlserver代理服務-百度經驗 ......

    uj5u.com 2023-04-20 08:25:13 more
  • Redis 報”OutOfDirectMemoryError“(堆外記憶體溢位)

    Redis 報錯“OutOfDirectMemoryError(堆外記憶體溢位) ”問題如下: 一、報錯資訊: 使用 Redis 的業務介面 ,產生 OutOfDirectMemoryError(堆外記憶體溢位),如圖: 格式化后的報錯資訊: { "timestamp": "2023-04-17 22: ......

    uj5u.com 2023-04-20 08:24:54 more
  • day02-2-商鋪查詢快取

    功能02-商鋪查詢快取 3.商鋪詳情快取查詢 3.1什么是快取? 快取就是資料交換的緩沖區(稱作Cache),是存盤資料的臨時地方,一般讀寫性能較高。 快取的作用: 降低后端負載 提高讀寫效率,降低回應時間 快取的成本: 資料一致性成本 代碼維護成本 運維成本 3.2需求說明 如下,當我們點擊商店詳 ......

    uj5u.com 2023-04-20 08:24:03 more
  • day02-短信登錄

    功能實作02 2.功能01-短信登錄 2.1基于Session實作登錄 2.1.1思路分析 2.1.2代碼實作 2.1.2.1發送短信驗證碼 發送短信驗證碼: 發送驗證碼的介面為:http://127.0.0.1:8080/api/user/code?phone=xxxxx<手機號> 請求方式:PO ......

    uj5u.com 2023-04-20 08:23:11 more