title: 資料庫完整性
date: 2020-12-12 11:05:07
tags: 資料庫
本章目标:
[ ] 什麼是資料庫完整性
[ ] 實體完整性
[ ] 參照完整性
[ ] 使用者自定義完整性
[ ] 用SQL語言定義關系模式的完整性限制條件
[ ] 重點:
[ ] DBMS完整性控制的實作機制:定義,檢查,違約
[ ] SQL語言定義關系模式的完整性條件
[ ] 難點:
[ ] RDBMS如何進行違約處理,其中比較複雜的是參照完整性的實作機制
資料庫的完整性 = 資料的正确性 + 資料的相容性
資料的正确性:符合現實世界的語義,反映目前的實際狀況(學号唯一,性别男女,成績範圍
資料的相容性:資料庫的同一對象在不同關系表中的資料是否符合邏輯
對比資料庫安全性
資料的完整性:
防止資料庫中不符合語義的資料,防止資料庫中存在不正确的資料
防範對象:不合語義的,不正确的資料
資料的安全性:
保護資料庫防止惡意的破壞和非法的存取
防範對象:非法使用者和非法操作
完整性是阻止合法使用者通過合法操作向資料庫中加入不正确的資料;
安全性防範是非法使用者和非法操作存取資料庫中的正确資料。
為維護資料庫的完整性,資料庫管理系統必須
[x] 提供定義完整性限制條件的機制
完整性限制條件也稱為完整性規則,是資料庫中的資料必須滿足的語義限制條件
SQL标準使用了一系列概念來描述完整性,包括關系模型的實體完整性、參照完整性和使用者定義完整性
這些完整性一般由SQL的資料DDL定義語言語句來實作
[x] 提供完整性檢查機制
資料庫管理系統中檢查資料是否滿足完整性限制條件的機制稱為完整性檢查。
一般在INSERT、UPDATE、DELETE語句執行後開始檢查,也可以在事務送出時檢查
[x] 違約處理: 資料庫管理系統若發現使用者的操作違背了完整性限制條件就采取一定的動作
拒絕(NOACTION)執行該操作>
級連(CASCADE)執行其他操作
關系模型的實體完整性
CREATE TABLE中用PRIMARY KEY
定義單屬性構成的碼有兩種說明方法
定義為列級限制條件
定義為表級限制條件
對多個屬性構成的碼隻有一種說明方法定義為表級限制條件
插入或對主碼列進行更新操作時,關系資料庫管理系統按照實體完整性規則自動進行檢查。
檢查主碼值是否唯一,如果不唯一則拒絕插入或修改
檢查主碼的各個屬性是否為空,隻要有一個為空就拒絕插入或修改
檢查記錄中主碼值是否唯一的一種方法是進行全表掃描;依次判斷表中每一條記錄的主碼值與将插入記錄上的主碼值(或者修改的新主碼值)是否相同
全表掃描缺點:十分耗時
為避免對基本表進行全表掃描,RDBMS核心般都在主碼上自動建立一個索引
若屬性(或屬性組)F是基本關系R的外碼,它與基本關系S的主碼K相對應(基本關系R和S不一定是不同的關系)
,則對于R中每個元組在F上的值必須為:
空值(F的每個屬性值均為空值)
等于S中某個元組的主碼值
關系模型的參照完整性定義:
CREATE TABLE 中用 FOREIGN KEY 短語定義哪些列為外碼
REFERENCES短語指明這些外碼參照哪些表的主碼
DBMS什麼時候進行參照完整性?會破壞參照完整性的操作 Insert,update
一個參照完整性将兩個表中的相應元組聯系起來;對被參照表和參照表進行增删改操作時有可能破壞參照完整性,必須進行檢查
參照完整性違約處理:
(1)拒絕(NO ACTION)執行
不允許該操作執行。該政策一般設定為預設政策
(2)級聯(CASCADE)操作
當删除或修改被參照表( Student)的一個元組造成了與參照表(SC)的不一緻,則删除或修改參照表中的所有造成不一緻的元組
(3)設定為空值(SET-NULL)
當删除或修改被參照表的一個元組時造成了不一緻,則将參照表中的所有造成不一緻的元組的對應屬性設定為空值。
顯式說明參照完整性的違約處理示例:
概念:針對某一具體應用的資料必須滿足的語義要求
關系資料庫管理系統提供了定義和檢驗使用者定義完整性的機制,不必由應用程式承擔
CREATE TABLE 時定義屬性上的限制條件
NOT NULL
UNIQUE
CHECK 檢查列值是否滿足一個條件表達式
候選碼:UNIQUE NOT NULL
屬性上的限制條件檢查和違約處理
插入元組或修改屬性的值時,關系資料庫管理系統檢查屬性上的限制條件是否被滿足
如果不滿足則操作被拒絕執行
元組上的限制條件定義
屬性上限制條件隻涉及單個屬性,元組級限制則可以設定不同屬性之間的取值的互相限制條件
在CREATE TABLE時可以用CHECK子句定義元組上的限制條件
元組上的限制條件檢查和違約處理
插入元組或修改屬性的值時,關系資料庫管理系統檢查元組上的限制條件是否被滿足
如果不滿足,則拒絕操作
1.完整性限制命名子句
CONSTRAINT <完整性限制條件名><完整性限制條件>
<完整性限制條件>包括NOT NULL、UNIQUE、PRIMARY KEY短語、FOREIGN KEY短語、CHECK短語等
2.修改表中的完整性限制
ALTER TABLE 語句,修改表中的完整性限制
删除:<code>ALTER TABLE Student DROP CONSTRAINT C4</code>
修改:先删除,後增加新的限制條件
SQL中,可以使用CREATE ASSERTION語句,通過聲明性斷言來指定更具一般性的限制
可以定義涉及計多個表的或聚集操作的比較複雜的完整性限制
斷言建立後,任何對斷言中所涉及的關系的操作都會觸發關系資料庫管理系統對斷言的檢查,任何使斷言不為真值得操作都會被拒絕執行
如何現有資料庫模式無法滿足業務需要,可以更改資料庫模式
如果斷言很複雜,則系統檢測和維護斷言的開銷比較高,這是在使用斷言時應該注意的!
删除斷言的語句格式
<code>DROP ASSERTION <斷言名></code>
使用者定義在關系表上的一類由事件驅動的特殊過程
任何使用者對表的增、删、改操作均由伺服器自動激活相應的觸發器
觸發器可以實施更為複雜的檢查和操作,具有更精細和更強大的資料控制能力
定義觸發器
隻有表的擁有者可以定義觸發器
觸發器名:可以包括模式名也可以不包括模式名;同一模式下,觸發器名必須是唯一的;觸發器名和模式名必須在同一模式下
觸發事件:INSET、DELET、UPDATE;幾個事件的組合;UPDATE OF<觸發列 ...>
表 名:觸發器隻能定義在基本表上,不能定義在視圖上;當基本表的資料發生變化時,将激活定義在該表上相應觸發事件的觸發器
行級觸發器和語句級觸發器
完整性限制是由系統自發觸發的,而觸發器是由事件觸發的
觸發器的執行,是由觸發事件激活的,并由資料庫伺服器自動執行
一個數表上可能定義了多個觸發器,遵循如下的執行順序:
執行該表上的BEFORE觸發器(如果多個,誰先建立誰先執行,也有按照名稱排序
激活觸發器的SQL語句
執行該表上的AFTER觸發器
慎重選擇觸發器,
DROP TRIGGER<觸發器名> ON <表名>
觸發器必須是一個已經建立的觸發器,并且隻能由具有相應權限的使用者删除