数据库系统原理复习提纲
數據庫系統原理復習提綱
參考文獻:A First Course in Database Systems | 3rd Edition
Authors:Jennifer Widom,Jeffrey D Ullman
視頻教程:https://www.bilibili.com/video/BV13J411J7Vu
中國人民大學信息學院-數據庫系統概論完整版(基礎篇+高級篇+新技術篇)
期末復習用,時間有限,難免有疏漏,還望各位批評指正,主要是寫一些對書里內容的理解。——??Sylvan Ding ??
文章目錄
- 數據庫系統原理復習提綱
- 關系數據模型
- 關系模型的組成
- 定義關系模式(表創建)
- 數據類型
- 約束條件
- 修改/刪除關系模式(表修改/刪除)
- 代數查詢語言
- 關系表達式
- 關系表達式樹
- 查詢優化
- 關系數據庫設計理論
- 求屬性集合的閉包
- 求某關系的所有候選碼/所有非平凡函數依賴
- 求FD的最小基本集
- 投影依賴的計算
- BCNF
- 定義
- 分解算法
- 3NF
- 定義
- 分解算法
- 高級數據庫模型
- ER模型建立
- ER模型轉關系模式
- ER模型設計原則
- ODL模型
- 代數和邏輯查詢語言
- 包上的關系操作
- 擴展操作符
- 數據庫語言
- SQL語法
- 事務
- 保證事務正確執行的ACID性質
- 事務的隔離級別
- 約束與觸發器
- 斷言
- check約束和斷言的對比
- 觸發器
- 視圖與索引
- 視圖更新
- 索引
- 計算最佳索引
- 服務器環境下的SQL
- 嵌入宿主語言的SQL
- 存儲過程
- 關系數據庫安全機制
- 授權和銷權
- 授權圖
關系數據模型
關系模型的組成
關系數據結構
關系模型中的數據在邏輯上是一張二維表,由行和列組成(二維表、行列)
關系操作
插入、刪除、更新、查詢(增刪改查)
關系完整性約束
實體完整性約束:屬性A是關系R的主屬性,則A不能取空值(主屬性不能為空)
參照完整性約束:F是R的外碼,和S中的主鍵K相對應,F必須為空或等于K中某個值(下文必須在上文出現)
用戶定義的完整性:對某一應用所涉及的數據必須滿足語意要求(根據實際自定義的約束)
定義關系模式(表創建)
數據類型
| char(n) | 定長n個字符,不足位補空格,效率最優 |
| varchar(n) | 變長,最多n個字符,實際存儲長度+1(存字符長度),空間最優 |
| text | 變長,非unicode,存儲量很大 |
| nchar(n) | 定長unicode |
| nvarchar(n) | 變長unicode |
| ntext | 變長unicode |
| binary/varbinary | 定長/變長 二進制 |
| image | 變長二進制,用于保存圖像 |
| bigint/int/smallint/tinyint | 整型 |
| bit | 模擬BOOLEAN |
| decimal(n,d) | n位有效位,d位小數位 |
| real/float | 浮點 |
| datetime | “YYYY-MM-DD HH:MM:SS” |
約束條件
create table <tb_name>(<attr_1> char(1) primary key, -- 主鍵約束<attr_2> int references tb_2(att_name) -- 外鍵約束on update cascade -- 級聯更新on delete set null, -- 置空值原則(默認“缺省原則”,拒絕更新)<attr_3> datetime unique not null default date '1900-12-12', -- 唯一、非空、默認值約束<attr_4> real [constraint c_name] check(attr_4<>10), -- 基于屬性的check約束,[約束命名],不等于用<>-- 也可以在末尾聲明約束constraint c_name primary key(attr_1),foreign key(attr_2) references tb_2(att_name),unique(attr_3),check(attr_1 in ('F','M')) ); -- 刪除約束 alter table <tb_name> drop constraint <c_name>; -- 添加約束,<type_of_constraint>=[primary key|foreign key|unique...] alter table <tb_name> add constraint <c_name> <type_of_constraint>(<attr>)...;修改/刪除關系模式(表修改/刪除)
-- 表刪除 drop table <t_name> -- 添加/刪除列 alter table <t_name> [add|drop] <column_name>; -- 添加/刪除約束 alter table <t_name> [add|drop] constraint <c_name>; -- 修改某列類型 alter table <t_name> alter column <col_name> <type>;代數查詢語言
關系表達式
投影:πA1,A2,?\pi _{A_1,A_2,\cdots}πA1?,A2?,??
選擇:σC\sigma _CσC?
自然連接:公共屬性相同的行保留,去掉重復列
θ\thetaθ 連接:不去重復列(比如用 R.A, S.A 表示),根據條件保留行
重命名:ρs(A1,A2,?)(R)\rho _s (A_1,A_2,\cdots) (R)ρs?(A1?,A2?,?)(R) 將R重命名為S,其屬性重命名為A1, A2…,也可省略S或A1, A2…
賦值:R(a1,a2) := <表達式>
關系表達式樹
表達式->表達式樹:表達式由外及里,表達式樹自上到下
表達式樹->表達式:表達式樹自下到上,表達式由里及外
查詢優化
順序:選擇、投影、連接
注意:先畫連接關系(簡單理解為找輸入-輸出-連接),確定連接個數,是對直接連接再選擇和投影的優化。在表達式中,可以用交、并、差運算,若題目中出現“沒有”字樣,則用差運算。
Students(Sno,Sname,Ssex,Sage,Sdept)
Courses(Cno, Cname, Cpno,Ccredit)
SC(Sno,Cno,Grade)
Q: 查詢選修了以2號課為先修課的課程的學生的名字?
輸入條件:2號課 Courses.Cpno=‘2’
輸出:學生的名字 Students.Sname
連接:Courses.Cno -> SC.Cno, SC.Sno -> Students.Sno
在連接前,先做選擇和投影即可。
關系數據庫設計理論
求屬性集合的閉包
求某關系的所有候選碼/所有非平凡函數依賴
求FD的最小基本集
FD右邊分解為單一屬性
去除能由其他FD推出的FD(整體最小化)
去除FD左邊多余的屬性(局部最小化)
兩種方法判定是否多余:(計算閉包是不用像2那樣除去FD)
求左邊屬性的閉包,閉包是否包含右邊所有屬性,若包含則左邊其余屬性多余
去除左邊某個屬性,觀察新FD集和原FD集是否依然等價
(去除左邊那個屬性后的新FD集是否能推出原FD集),若等價則該屬性多余
重復2-3,直到不能再化簡為止
投影依賴的計算
BCNF
定義
當且僅當所有非平凡FD的左邊均包含任意一個候選碼,或者說所有非平凡FD都是超碼。
滿足BCNF,則一定滿足NF-1、2、3,即不存在非主屬性對主屬性的部分依賴、傳遞依賴,主屬性間不存在部分依賴、傳遞依賴。
注意:任何二元關系都滿足BCNF。
分解算法
假定輸入的FD集已經為最簡,否則需要最小化FD集。
根據定義找BCNF違例
先確定所有候選碼,再找違例
對違例進行分解
如違例 X->Y,X 中不包含候選碼,那么求 X+,由X+組成一個分組,另一個分組由X和不在X+的其他屬性組成,也就是說X要在兩個分組中均存在,以此作為分解后二者連接的依據。求X+并組成一個分組也就是希望這個分組盡量滿足BCNF,分解到最后一定能滿足BCNF
最小化兩分組的FD集,求投影FD集,遞歸進行1-2分解,直到所有分組滿足BCNF
R(ABCD), {AB-C,C-D,D-A}
A+={A},B+={B},C+={C,D,A},D+={D,A}
{AB}+={ABCD},{AC}+={A,C,D},{AD}+={A,D}
{BC}+={B,C,D,A},{BD}+={B,D,A,C},{CD}+={C,D,A}
{ABC}+=-,{ABD}+=-,{ACD}+={C,D,A},{BCD}+=-
{ABCD}不必考慮,肯定是平凡依賴
注意:{ABC}+、{ABD}+、{BCD}+可由{AB}+={ABCD}…等直接得出,無需再計算
而且,{ABC}+、{ABD}+、{BCD}+是超碼,不算入候選碼中,所以結果用-表示
A+={A},B+={B},{AD}+={A,D},{ACD}+={C,D,A}是平凡依賴,不考慮
候選碼:AB,BC,BD
除去上述超碼、平凡依賴、候選碼后,剩余的:
C+={C,D,A},D+={D,A}
{AC}+={A,C,D},{CD}+={C,D,A}
此時,BCNF違例為
C-D,C-A,D-A,AC-D,CD-A
選擇一個違例進行分解,應當經可能向右邊添加屬性,以減少工作量
選擇C-DA進行分解,{C}+={ACD}
則分解為R1{ACD},R2{BC}
計算R1投影的函數依賴
A+={A},C+={CDA},D+={DA}
{AC}+=-,{AD}+={AD},{CD}+=-
候選碼:C
BCNF違例:D-A
{D}+={DA}
分解為R11{AD},R12{CD}
又知,二元關系肯定滿足BCNF,所以分解結果{BC},{AD},{CD}
3NF
定義
BCNF放寬要求,要么FD左邊是超碼,要么FD右邊全是主屬性。
分解算法
若沒有一個分組包括原關系的候選鍵,則添加一個分組,分組為任一候選鍵,一次確保無損連接性
注意:該分解算法具有無損連接和依賴保持性質。
R(ABCDE), {AB-C,C-B,A-D}
最小化基本集:
{A}+={AD},{B}+={B},所以AB不多余,也沒有FD是多余的,所以已經最小化
那么,{ABC},{BC},{AD},其中{BC}是{ABC}的子集,所以刪除
計算候選鍵:
AB+=ABCD,AC+=ABCD, 顯然,ABE和ACE是候選鍵
添加候選鍵,則分解結果為 {ABC}{AD},{ABE}或{ACE}
高級數據庫模型
ER模型建立
注意:一對多聯系,一方那段連線要畫箭頭。
多路聯系:箭頭指向的那個實體集,由其他實體集函數決定
多路聯系轉二元聯系:“聯系中心轉實體集,再添加多個聯系”
isa聯系:父類的主鍵一定在子類中出現
參照完整性約束:A–)B,說明A參照B,A一定要在B文中出現,而且是一對一或者多對一(一方帶箭頭)
弱實體集:依賴一個實體集而存在,本質上就是參照完整性約束,也就是說A的主鍵一定在B的主鍵中出現過,然后再為弱實體集設置一個主鍵,即弱實體集的主鍵由對應“強”實體集的主鍵和弱實體集的主鍵共同構成(對比外鍵的概念即可)
注意:isa聯系和弱實體集的區別是,弱實體集本質上是參照完整性約束,需要增加屬于弱實體集的主鍵部分,而isa聯系則不能改變父類的主鍵,子類都要繼承父類主鍵,可以添加其他屬性,但屬性不能成為子類鍵的一部分。
ER模型轉關系模式
聯系轉關系
聯系的屬性是和該聯系直接相連的實體的鍵。
多對一聯系,聯系的鍵為多方實體集的鍵;
多對多聯系,聯系的鍵為聯系的所有屬性;
一對一聯系,聯系的鍵為任意一方實體集的鍵。
(和“函數決定”理論相關)
關系組合
上述聯系轉關系不一定是最優的,比如“多對一”、“一對一”關系都可以合并
實體集轉化為另一個實體集的屬性,要求改實體集是全碼,否則會冗余
處理弱實體集
支持聯系無需轉化為關系,因為已經“關系組合”到弱實體集的關系屬性中
子類結構處理
對比:空值法占用空間最多,ER法有信息重復,面向對象法占空間最少,且無重復。
ER模型設計原則
忠實性:設計要反映現實情況
Stars和Movies之間定義聯系Star-in,應該是多對多聯系;
不能把屬性“氣缸數”與stars聯系,卻可以把它作為汽車的屬性。
避免冗余:一件事在模型中只出現一次
在電影和電影公司之間用了聯系Owns。又把電影公司的名稱studioName選作電影實體集的一個屬性。
兩次表示“所屬的制片公司”這一同樣的事實
簡單性考慮:模型元素越少越好
選擇正確聯系:舍棄冗余、無關的聯系
選擇正確元素種類:用屬性還是用實體集?用實體集還是用聯系?屬性<–>實體<–>聯系
屬性代替實體集E的條件:
記憶:裝b剪連元(一個裝b的人剪斷了連在一起的元宵)= (裝)忠實性(b)避免冗余(剪)簡單性考慮(連)聯系(元)元素種類
ODL模型
class Movie {attribute string title;attribute integer year;attribute enum Genres{drama,comedy...} genre; // enum聲明枚舉型屬性genre,Genres為枚舉名稱// relationship聲明名為stars的聯系// Set<Star>為一對多聯系,表示一部電影有多個影星// inverse Star::starredIn 說明stars聯系為Star類中starredIn聯系的反向聯系relationship Set<Star> starsinverse Star::starredIn; relation Studio ownedByinverse Studio::owns; };class Star {attribute string name;attribute Struct Addr{string street, string city} addr; // Struct聲明結構型屬性addrrelationship Set<Movie> inverse Movie::stars; };class Studio {attribute string name;attribute Star::Addr address; // 引用Star域的Addr結構relationship Set<Movie> ownsinverse Movie::ownedBy; };注意:
類中元素有兩種:attribute和relationship,其后接類型和元素名
[attribute|relationship] <type> <ele_name>;
比如 relationship Set<Movie> owns inverse Movie::ownedBy 表示Studio中,有一組Movie,和Movie的ownedBy這個Studio類互為反向關系。
class CMM (key(k1,k2)) extends M1:M2 {relationship Array<...> rs_name;// CMM繼承了M1和M2的所有元素,并添加了自己的屬性 re_name// 用 key(k1,k2) 聲明了CMM的鍵(K1,K2) }代數和邏輯查詢語言
包上的關系操作
注意:包可以有重復
擴展操作符
消重:δ\deltaδ
聚集:MIN、MAX、AVG、COUNT、SUM
分組聚集:γA1,A2,agg(A3)→agg3,agg(A4)→agg4(R)\gamma _{A1,A2,agg(A3)\to agg3,agg(A4)\to agg4} (R)γA1,A2,agg(A3)→agg3,agg(A4)→agg4?(R) ,表示將R的A1和A2作為分組屬性,在A3和A4屬性上做agg聚合,聚合結果投影到agg3和agg4這兩列上,x→yx\to yx→y 表示將x重命名為y
投影擴展:πA?B→C(R)\pi _{A-B \to C}(R)πA?B→C?(R) 將R上A-B的結果重命名為C
排序:τB,C\tau _{B,C}τB,C? ,從小到大排序,按B,C屬性先后
外連:懸浮元組指的是不能和另一張表配對(配對指的是符合條件,比如自然連接需要符合名相同的列值相等的條件,theta連接需要符合特定條件)的本表元組。解題方法:先正常內連(笛卡爾積+篩選),最后再加入各表的懸浮元組。左連和右連表示只保留左/右懸浮元組。!注意:如果是自然連接,要去除重復列,如果是theta連接,則不去除重復列,相同列名加前綴保留!
數據庫語言
SQL語法
字符串匹配通配符:%任意字符串(n>=0),_單個字母,[ ] 字符選擇,[^] 字符選擇的否定,兩個’‘表示一個’
排序:ORDER BY A1,A2 [DESC],默認升序,DESC降序
From:FROM (table1) new_name 在table名后為table命新名
交、并、差:INTERSECT、UNION、EXCEPT. 例如 (SELECT ...) INTERSECT [ALL] (SELECT ...), 注意:三者默認消重,若不希望消重,則應加[ALL]
比較運算符:用 ANY/ALL 對WHERE選擇的結果進行聚合
theta連接:SELECT...FROM ...JOIN...ON... ON 后為連接條件
自然連接:NATURE [FULL/LEFT/RIGHT] [OUTER] JOIN [ON]...
消重:SELECT DISTINCT ...
COUNT查不重復:SELECT COUNT(DISTINCT ...) FROM ...
查詢順序:select > from > where > group by > having > order by
插入查詢值:insert into <table_name> (select...)
修改:update ...set ...=..., ...=... where ...
字符串拼接:‘A’||‘B’
事務
保證事務正確執行的ACID性質
-
A(Atomicity)原子性
事務不可分割,事務中的操作要么都發生,要么都不發生(不可分)
-
C(Consistency)一致性
事務前后數據的完整性必須一致
-
I(Isolation)隔離性
并發事務間相互隔離,不相互干擾
-
D(Duration)持久性
一旦事務被提交,對數據的改變是永久性的
事務的隔離級別
| 讀未提交 read uncommitted | ? | ? | ? |
| 讀提交 read committed | ? | ? | |
| 可重復讀 repeatable read | ? | ||
| 可串行化 serializable |
約束與觸發器
斷言
本質上,斷言就是對數據庫的全局的check約束。任何引起斷言為假的數據庫更新都將被阻止,且斷言的條件<condition>中不能有任何屬性,可以用自查詢和EXISTS做判斷。斷言的條件可能暫時為假(比如在事件的執行過程中),在事件結束時再檢查斷言條件。
create assertion <ass_name> check (<condition>); -- 創建斷言 drop assertion <ass_name>; -- 刪除斷言check約束和斷言的對比
基于屬性的check約束:在某屬性上更新時檢查,對子查詢沒有約束效力;
基于表的check約束:在某表的任何一個屬性更新時檢查,對子查詢沒有約束效力;
斷言:對引起斷言條件變化的任何可能的更新檢查,對子查詢有約束效力,是基于數據庫的約束。
觸發器
create trigger <tg_name> -- 創建觸發器 [after|before|instead of] [options] on <tb_name> -- options是增刪改查,其中update可以加of,表示對某屬性的更新 referencing -- 聲明新舊元組/表old [row|table] as <old_name> -- 刪除操縱new [row|table] as <new_name> -- 插入操作-- 二者均存在:更新操作 for each [row|statement] -- 定義行/語句級觸發器 -- 行級觸發器每行觸發一次,而語句級觸發器每條語句出發一次 when(<condition>) -- 觸發條件(可以沒有),比如可以是 old.val<new.val begin -- (執行語句,多條則用begin和end包括) ...; -- 比如 update <tb_name> -- set <col_name>=<new_name>.<col_name> -- where <col_name>=<old_name>.<col_name>; end;視圖與索引
視圖創建:create view <view_name>(newA1,newA2,...) as ... ,newA1、newA2給屬性重命名
視圖刪除:drop view...
視圖更新
只能更新 行列子集視圖:由單表導出的,含有其某些行列的視圖。必須要含有所有主鍵,因為主鍵不能為空。where子句不能查詢自己。可以在視圖上定義 instead of 觸發器從而解決一些更新異常。
索引
create index <index_name> on <tb_name>(<att1>,<att2>...) -- 創建索引 drop index <index_name> -- 刪除索引計算最佳索引
考慮上述員工表Staff上的索引,假定:Staff(sid,pay_rank,service_year)
員工編號sid是主鍵;(給定一個sid值,只可能查出1條元組,只需調入1個磁盤頁)
每個索引需占用2個磁盤頁
存儲關系Staff的磁盤頁為100,如果要檢查整個關系,則代價為100;
關系按照薪酬級別pay_rank聚合,這樣只需一次磁盤訪問操作就可以找到給定薪酬級別的員工;
每個service_year平均有5名員工,且平均分散在5個磁盤頁上;
僅需一次磁盤訪問就可讀取用于容納新元組的磁盤頁。在該關系上有如下形式的查詢
Q1: SELECT * FROM Staff WHERE sid = s;
Q2: SELECT * FROM Staff WHERE pay_rank=p;
Q3: SELECT * FROM Staff WHERE service_year=y;
I: 插入新元組到表staff中。
計算上面4種操作在無索引、sid索引、pay_rank索引、service_year索引和全索引5種情況下的平均操作代價,填入表1中。
無索引的情況下,任何Q查詢都需要訪問所有100個磁盤頁,遍歷所有數據頁。
有索引時,先讀入索引,消耗一次訪存(本題是兩次,因為每個索引需占用2個磁盤頁),再根據索引直接讀對應的磁盤頁(一次),索引Q1和Q2在有相應索引時是3=2+1。
而Q3,每個service_year平均有5名員工,且平均分散在5個磁盤頁上,所以要讀入5個磁盤頁,7=2+5。
無索引插入,讀一頁,寫回一頁,兩次訪存。有索引插入,讀+寫回索引2次,每個索引2頁,4次,加上數據讀和寫回2次,共6次。全索引插入,讀+寫回索引2次,每個索引2頁,3個索引,12次,14=12+2.
| Q1 | 100 | 3 | 100 | 100 | 3 |
| Q2 | 100 | 100 | 3 | 100 | 3 |
| Q3 | 100 | 100 | 100 | 7 | 7 |
| I | 2 | 6 | 6 | 6 | 14 |
服務器環境下的SQL
嵌入宿主語言的SQL
// **游標更新** // 查看MovieExec的每個元組,決定刪除還是將其凈資產翻倍 #define NO_MORE_TUPLE !(strcmp(SQLSTATE,"02000")) // 宏定義,游標取完的標識void changeWorth(){// 共享變量聲明EXEC SQL BEGIN DECLARE SECTION;int certNo,worth; char SQLSTATE[6]; // SQLSTATE 返回SQL狀態,5個字節EXEC SQL END DECLARE SECTION;EXEC SQL DECLARE execCursor CURSOR FOR <query>; // 聲明游標:declare <cursor_name> cursor for ...查詢語句,也可以直接是一個表名EXEC SQL OPEN execCursor; // 開啟游標 open <cursor_name>// 進入循環while(1){// 取數據 fetch from <cursor_name> into [:share_variables]...;EXEC SQL FETCH FROM execCursor INTO :certNo, :worth;// SQL語句中使用共享變量要加:if(NO_MORE_TUPLE) break; // 跳出條件,fetch查完了if(worth<10000)EXEC SQL DELETE FROM MovieExec WHERE CURRENT OF CURSOR; // 使用游標,where只能用CURRENT OF CURSORelseEXEC SQL UPDATE MovieExec SET netWorth=2*netWorth WHERE CURRENT OF CURSOR;}// 關游標EXEC SQL CLOSE execCursor; }存儲過程
計算某電影公司制作的影片長度的平均值和方差
-- **方差=\sum x_i^2/n-\bar{x}^2 -- loop循環結構,需要寫退出條件 delcare NOT_FOUND condition for sqlstate '02000' create procedure MeanVar( -- 存儲過程創建in s char(15),out mean real,out variance real-- 聲明參數,輸入/輸出,[in|out|inout] <param_name> <type>-- SQL中,變量名在前,類型在后 ) -- 局部變量聲明 declare NOT_FOUND condition for sqlstate '02000'; -- 循環退出條件聲明 declare MV cursor for select lenth from movies where studioName=s; -- 游標聲明 declare MC integer; declare newlenth integer; -- 注意:在存儲過程聲明中創建的輸出參數不需要重復聲明 -- 程序體 begin-- 存儲過程中賦值操作用setset mean=0.0;set variance=0.0;set MC=0;set newlenth=0;-- 開游標open MV;movieloop:loop-- loop循環,<loop_name>:loop ~~~ end loop;-- 取數據fetch from MV into newlenth;-- 判退出if NOT_FOUND then leave movieloop end if;-- 數據處理set MC=MC+1;set mean=mean+newlenth;set variance=variance+newlenth*newlenth;end loop;-- 關閉游標close MV;-- 輸出set mean = mean/MC;set variance = variance/MC - mean*mean; end; -- for 循環結構,無需寫退出條件 -- for <loop name> as <cursor name> cursor for <query>; -- do <statement list> -- end for; -- 1. 創建存儲過程 create procedure (-- 2. 填寫參數:輸入輸出in s char(15),out mean real,out variance real ) -- 3. 局部變量聲明,因為是for循環,所以不用聲明退出條件變量 declare MC int;-- 開始語句,記得加begin和end begin-- 4. 變量賦初值(包括輸出變量)set MC = 0;set mean = 0.0;set variance = 0.0;-- 5. 創建for循環,在for循環中創建游標,注意for循環的尾部有個 ;for movieLoop as MV cursor for select lenth from movies where studioName=s;-- 6. 定義數據處理do-- 注意:for循環不用取數據了,可直接使用上述select的屬性set mean = mean + lenth;set variance = variance + lenth*lenth;set MC = MC + 1;end for;set mean = mean/MC;set variance = variance/MC + mean*mean; end;記憶(一般模式):
-- 1. 創建存儲過程 create procedure(-- 2. 聲明輸入輸出參數 ) -- 3. declare 聲明局部變量 declare ...; -- 4. 如果是loop,那么要聲明退出條件變量 declare ... condition for sqlstate '02000';-- 5. 寫操作體 begin -- 6. 初始化變量和參數 set ... = ...; -- 7. 開游標(loop循環) -- 8. 寫loop循環<loop_name>:loop-- 8.1 取數據fetch from <cursor_name> into ...;-- 8.2 判退出if NOT_FOUND then leave <loop_name> end if;-- 8.3 數據操作...;end loop;-- 8.4 關游標 -- 9. 寫for循環for <loop_name> as <cursor_name> cursor for <query>;-- 9.1 寫循環體do...;end for; -- 10. 后續操作 end;關系數據庫安全機制
授權和銷權
<權限>:ALL PRIVILEGES 表示所有權限
<數據庫元素>:除了表和視圖以外,其余數據庫元素應當加上 <類型>,即<類型><元素名稱>
-- 授權 grant <權限> on <數據庫元素> to <用戶1>,<用戶2>... [with grant option]; -- 銷權 revoke <權限> on <數據庫元素> from <用戶1>,<用戶2>... [cascade];習題10.1.1解答 Chegg
In SQL there are nine types of privileges, those are:
- SELECT
- INSERT
- DELETE
- UPDATE
- REFERENCES
The statement Select-From-Where always requires the SELECT privileges on every table on which it queried or accessed.
On other hand REFERENCES privileges on a relation , which it refers to that relation in an integrity constraint.
Not only reference to relation but also it will consider some other form as referential integrity constraint or assertions or tuple based checks etc.
授權圖
注意事項:
——??Sylvan Ding ??
總結
以上是生活随笔為你收集整理的数据库系统原理复习提纲的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JSP执行流程
- 下一篇: 计算机操作系统——处理机调度算法