資料庫的完整性
資料的正確性
是指資料是符合現實世界語義,反映了當前實際狀況的
資料的相容性
是指資料庫同一物件在不同關係表中的資料是符合邏輯的
例如,學生的學號必須唯一
性別只能是男或女
本科學生年齡的取值範圍為14~50的整數
學生所選的課程必須是學校開設的課程,學生所在的院系必須是學校已成立的院系
等等資料的完整性和安全性是兩個不同概念
資料的完整性
防止資料庫中存在不符合語義的資料,也就是防止資料庫中存在不正確的資料
防範物件:不合語義的、不正確的資料
資料的安全性
保護資料庫 防止惡意的破壞和非法的訪問
防範物件:非法使用者和非法操作
為維護資料庫的完整性,資料庫管理系統必須:
1.提供定義完整性約束條件的機制
完整性約束條件也稱為完整性規則,是資料庫中的資料必須滿足的語義約束條件
sql標準使用了一系列概念來描述完整性,包括關係模型的實體完整性、參照完整性和使用者定義完整性
這些完整性一般由sql的資料定義語言語句來實現
2.提供完整性檢查的方法
資料庫管理系統中檢查資料是否滿足完整性約束條件的機制稱為完整性檢查。
一般在insert、update、delete語句執行後開始檢查,也可以在事務提交時檢查
3.違約處理
資料庫管理系統若發現使用者的操作違背了完整性約束條件,就採取一定的動作
拒絕(no action)執行該操作
級連(cascade)執行其他操作
表掃瞄缺點
十分耗時
為避免對基本表進行全表掃瞄,rdbms核心一般都在主碼上自動建立乙個索引
例如,新插入記錄的主碼值是25
被參照表(例如student)
參照表(例如sc)
違約處理
可能破壞參照完整性
插入元組
拒絕可能破壞參照完整性
修改外碼值
拒絕刪除元組
可能破壞參照完整性
拒絕/級連刪除/設定為空值
修改主碼值
可能破壞參照完整性
拒絕/級連修改/設定為空值
參照完整性違約處理
(1) 拒絕(no action)執行
不允許該操作執行。該策略一般設定為預設策略
(2) 級聯(cascade)操作
當刪除或修改被參照表(student)的乙個元組造成了與參照表(sc)的不一致,則刪除或修改參照表中的所有造成不一致的元組
(3)設定為空值(set-null)
當刪除或修改被參照表的乙個元組時造成了不一致,則將參照表中的所有造成不一致的元組的對應屬性設定為空值。
對於參照完整性,除了應該定義外碼,還應定義外碼列是否允許空值
參見愛課程網資料庫系統概論5.2節動畫《參照完整性》
5.3 使用者定義的完整性
使用者定義的完整性是:針對某一具體應用的資料必須滿足的語義要求
關聯式資料庫管理系統提供了定義和檢驗使用者定義完整性的機制,不必由應用程式承擔
5.3.1 屬性上的約束條件
create table時定義屬性上的約束條件
列值非空(not null)
列值唯一(unique)
檢查列值是否滿足乙個條件表示式(check)
2. 屬性上的約束條件檢查和違約處理
插入元組或修改屬性的值時,關聯式資料庫管理系統檢查屬性上的約束條件是否被滿足
如果不滿足則操作被拒絕執行
1.完整性約束命名子句
constraint 《完整性約束條件名》《完整性約束條件》
《完整性約束條件》包括not null、unique、primary key短語、foreign key短語、check短語等
2. 修改表中的完整性限制
使用alter table語句修改表中的完整性限制
5.6 斷言
sql中,可以使用 create assertion語句,通過宣告性斷言來指定更具一般性的約束。
可以定義涉及多個表的或聚集操作的比較複雜的完整性約束。
斷言建立以後,任何對斷言中所涉及的關係的操作都會觸發關聯式資料庫管理系統對斷言的檢查,任何使斷言不為真值的操作都會被拒絕執行
1. 建立斷言的語句格式
create assertion《斷言名》
每個斷言都被賦予乙個名字,
[例5.18] 限制資料庫課程最多60名學生選修
create assertion asse_sc_db_num
check (60 >= (select count(*)
/*此斷言的謂詞涉及聚集操作count的sql語句*/
from course,sc
where sc.cno=course.cno and course.cname ='資料庫')
2. 刪除斷言的語句格式為
drop assertion 《斷言名》;
如果斷言很複雜,則系統在檢測和維護斷言的開銷較高,這是在使用斷言時應該注意的
5.7 觸發器
觸發器(trigger)是使用者定義在關係表上的一類由事件驅動的特殊過程
5.7.1 定義觸發器
create trigger語法格式
create trigger 《觸發器名》
《觸發事件》 on 《表名》
referencing new|old row as《變數》
for each
[when 《觸發條件》]《觸發動作體》
觸發器又叫做事件-條件-動作(event-condition-action)規則。
當特定的系統事件發生時,對規則的條件進行檢查,如果條件成立則執
行規則中的動作,否則不執行該動作。規則中的動作體可以很複雜,通
常是一段sql儲存過程。
定義觸發器的語法說明
(1)表的擁有者才可以在表上建立觸發器
(2)觸發器名
觸發器名可以包含模式名,也可以不包含模式名
同一模式下,觸發器名必須是唯一的
觸發器名和表名必須在同一模式下
(3)表名
觸發器只能定義在基本表上,不能定義在檢視上
當基本表的資料發生變化時,將啟用定義在該錶上相應觸
發事件的觸發器
(4)觸發事件
觸發事件可以是insert、delete或update
也可以是這幾個事件的組合
還可以update of《觸發列,...>,即進一步指明修改哪些列時啟用觸發器
after/before是觸發的時機
(5)觸發器型別
例如,在例5.11的teacher表上建立乙個after update觸發器,觸發事件是update語句:
update teacher set deptno=5;
假設表teacher有1000行
如果是語句級觸發器,那麼執行完該語句後,觸發動作只發生一次
(6)觸發條件
觸發器被啟用時,只有當觸發條件為真時觸發動作體才執行;否則觸發動作體不執行。
如果省略when觸發條件,則觸發動作體在觸發器啟用後立即執行
如果是行級觸發器,觸發動作將執行1000次
(7)觸發動作體
觸發動作體可以是乙個匿名pl/sql過程塊
也可以是對已建立儲存過程的呼叫
如果是行級觸發器,使用者都可以在過程體中使用new和old引用事件之後的新值和事件之前的舊值
如果是語句級觸發器,則不能在觸發動作體中使用new或old進行引用
如果觸發動作體執行失敗,啟用觸發器的事件就會終止執行,觸發器的目標表或觸發器可能影響的其他物件不發生任何變化
注意:不同的rdbms產品觸發器語法各不相同
5.7.2 啟用觸發器
觸發器的執行,是由觸發事件啟用的,並由資料庫伺服器自動執行
乙個資料表上可能定義了多個觸發器,遵循如下的執行順序:
(1) 執行該錶上的before觸發器;
(2) 啟用觸發器的sql語句;
(3) 執行該錶上的after觸發器。
5.7.3 刪除觸發器
刪除觸發器的sql語法:
drop trigger 《觸發器名》 on 《表名》;
觸發器必須是乙個已經建立的觸發器,並且只能由具有相應許可權的使用者刪除。
小結資料庫的完整性是為了保證資料庫中儲存的資料是正確的
關聯式資料庫管理系統完整性實現的機制
完整性約束定義機制
完整性檢查機制
違背完整性約束條件時關聯式資料庫管理系統應採取的動作
第五章 資料庫
資料庫按照一定的規則儲存程式資料,程式再發起查詢取回所需的資料。web程式最常用基於關係模型的 資料庫,這種資料庫也稱為sql資料庫。因為它們使用結構化查詢語言。近幾年流行文件資料庫 和 鍵值對資料庫 成了最流行戴爾替代選擇,這兩種資料庫合稱nosql資料庫。nosql資料庫一般使用集合代替表,使用...
資料庫第五章習題
學號 2013211492 第二題 1 學生 學號,姓名,出生日期,系名,班號,宿舍區 班級 班號,專業名,系名,系辦公室地點,人數 系 系名,系號,系辦公室地點,人數 學會 學會名,成立年份,地點,人數,入會年份 2 學生關係的最小函式依賴集 f 存在傳遞依賴 學號 系名,系名 宿舍區 班級關係的...
優化資料庫第五章
t sql使用下列語句來管理事務 1.begin transaction 2.commit transaction 3.rollback transaction 使用全域性變數 error判斷事務操作是否成功。1.error儲存最近一條sql語句的執行結果。2.如果sql語句執行成功,則 error...