數據庫系統概論——第五章 數據庫完整性

數據庫系統概論——第五章 數據庫完整性

零. 引言
(1)數據庫的完整性:
正確性:是指數據是符合現實世界語義,反映了當前實際狀況的
相容性:是指數據庫同一對象在不同關係表中的數據是符合邏輯的
(2)完整性與安全性區別:
完整性:防範對象是不合語義的、不正確的數據
安全性:防範對象是非法用戶和非法操作。
(3)爲維護數據庫的完整性,DBMS必須:
1)提供定義完整性約束條件的機制。
2)提供完整性檢查的方法:一般在INSERT、UPDATE、DELETE語句執行後開始檢查,也可以在事務提交時檢查
3)違約處理 :數據庫管理系統若發現用戶的操作違背了完整性約束條件,就採取一定的動作
拒絕(NO ACTION)執行該操作
級連(CASCADE)執行其他操作

一. 實體完整性
1. 實體完整性定義
(1)關係模型中的實體完整性
create table 中用primary key定義
(2)單屬性構成的碼由兩種說明
定義爲列級約束條件
定義爲表級約束條件
(3)對多個屬性構成的碼只有一種說明方法
定義爲表級約束條件

在這裏插入圖片描述
在這裏插入圖片描述

2. 實體完整性檢查和違約處理
(1)插入或對主碼列進行更新操作時,關係數據庫管理系統按照實體完整性規則自動進行檢查。包括:
1)檢查主碼值是否唯一,如果不唯一則拒絕插入或修改
2)檢查主碼的各個屬性是否爲空,只要有一個爲空就拒絕插入或修改
(2)檢查記錄中主碼值是否唯一的一種方法是進行全表掃描:依次判斷表中每一條記錄的主碼值與將插入記錄上的主碼值(或者修改的新主碼值)是否相同 ,這種方法費時,爲避免對基本表進行全表掃描,RDBMS核心一般都在主碼上自動建立一個索引

在這裏插入圖片描述
二、 參照完整性

  1. 參照完整性定義
    在CREATE TABLE中用FOREIGN KEY短語定義哪些列爲外碼
    用REFERENCES短語指明這些外碼參照哪些表的主碼
  2. 參照完整性檢查和違約處理
    一個參照完整性將兩個表中的相應元組聯繫起來
    對被參照表和參照表進行增刪改操作時有可能破壞參照完整性,必須進行檢查

在這裏插入圖片描述
(1)拒絕(no action)執行
不允許該操作執行。該策略一般設置爲默認策略
(2)級聯(caseade)操作
當刪除或修改被參照表(Student)的一個元組造成了與參照表(SC)的不一致,則刪除或修改參照表中的所有造成不一致的元組
(3)設置爲空值
當刪除或修改被參照表的一個元組時造成了不一致,則將參照表中的所有造成不一致的元組的對應屬性設置爲空值。

對於參照完整性,除了應該定義外碼,還應定義外碼列是否允許空值

顯示地說明參照完整性的違約處理示例

三、用戶定義的完整性

用戶定義的完整性是:針對某一具體應用的數據必須滿足的語義要求
關係數據庫管理系統提供了定義和檢驗用戶定義完整性的機制,不必由應用程序承擔

  1. 屬性上的約束條件
    (1)create table時定義屬性上的約束條件
    1)not null 列值不爲空
    2)unique 列值唯一
    3)check 檢查列值是否滿足一個條件表達式

    在這裏插入圖片描述

    在這裏插入圖片描述
    (2)屬性上的約束條件檢查和違約處理
    插入元組或修改屬性的值時,關係數據庫管理系統檢查屬性上的約束條件是否被滿足
    如果不滿足則操作被拒絕執行

  2. 元祖上的約束條件
    (1)在CREATE TABLE時可以用CHECK短語定義元組上的約束條件,即元組級的限制
    同屬性值限制相比,元組級的限制可以設置不同屬性之間的取值的相互約束條件

    (2)元組上的約束條件檢查和違約處理
    插入元組或修改屬性的值時,關係數據庫管理系統檢查元組上的約束條件是否被滿足
    如果不滿足則操作被拒絕執行

四、完整性約束命名子句

  1. 完整性約束命名子句
    constraint<完整性約束條件名><完整性約束條件>
    <完整性約束條件>包括:not null、unique、ptimary key短語、foreign key短語、check 短語等
    在這裏插入圖片描述

  2. 修改完整性約束
    (1)去掉完整性約束(以下方法mysql8不適用)在這裏插入圖片描述
    (2)修改完整性約束(先刪除 後增加)

五、 斷言(mysql現在還不支持斷言)

  1. SQL中,可以使用 CREATE ASSERTION語句,通過聲明性斷言來指定更具一般性的約束。
    2.可以定義涉及多個表的或聚集操作的比較複雜的完整性約束。
    3.斷言創建以後,任何對斷言中所涉及的關係的操作都會觸發關係數據庫管理系統對斷言的檢查,任何使斷言不爲真值的操作都會被拒絕執行
  1. 創建斷言的語句格式

eg:限制數據庫課程最多60名學生選修

在這裏插入圖片描述
2. 刪除斷言的語句格式

六、觸發器

1. 概念
觸發器(tigger)是用戶定義在關係表上的一類由事件驅動的特殊過程
(1)觸發器保存在數據庫服務器中
(2)任何用戶對錶的增、刪、改操作均有服務器自動激活相應的觸發器
(3)觸發器可以實施更爲複雜的檢查和操作,具有更精細和更強大的數據控制能力

2. 定義觸發器

觸發器又叫做事件-條件-動作(event-condition-action)規則。
當特定的系統事件發生時,對規則的條件進行檢查,如果條件成立則執
行規則中的動作,否則不執行該動作。規則中的動作體可以很複雜,通
常是一段SQL存儲過程。

SQL標準
create tigger<觸發器名>
{before|after}<觸發事件> on <表名>
referencing new|old row as <變量>
for each{row|statement}
[with<觸發條件>]<觸發動作體>

定義觸發器的語法說明
(1)表的擁有者纔可以在表上創建觸發器
(2)觸發器名
觸發器名可以包含模式名,也可以不包含模式名
同一模式下,觸發器名必須是唯一的
觸發器名和表名必須在同一模式下
(3)表名
觸發器只能定義在基本表上,不能定義在視圖上
當基本表的數據發生變化時,將激活定義在該表上相應觸 發事件的觸發器
(4)觸發事件
觸發事件可以是INSERT、DELETE或UPDATE也可以是這幾個事件的組合
還可以UPDATE OF<觸發列,…>,即進一步指明修改哪些列時激活觸發器
AFTER/BEFORE是觸發的時機
AFTER表示在觸發事件的操作執行之後激活觸發器
BEFORE表示在觸發事件的操作執行之前激活觸發器

(5)觸發器類型
行級觸發器(FOR EACH ROW)
語句級觸發器(FOR EACH STATEMENT)

例如,在例TEACHER表上創建一個AFTER UPDATE觸發器觸發事件是UPDATE語句:
UPDATE TEACHER SET Deptno=5;
假設表TEACHER有1000行
如果是語句級觸發器,那麼執行完該語句後,觸發動作只發生一次
如果是行級觸發器,觸發動作將執行1000次

(6)觸發條件
1)觸發器被激活時,只有當觸發條件爲真時觸發動作2)體才執行;否則觸發動作體不執行。
如果省略WHEN觸發條件,則觸發動作體在觸發器激活後立即執行
(7)觸發動作體
1)觸發動作體可以是一個匿名PL/SQL過程塊也可以是對已創建存儲過程的調用
2)如果是行級觸發器,用戶都可以在過程體中使用NEW和OLD引用事件之後的新值和事件之前的舊值
3)如果是語句級觸發器,則不能在觸發動作體中使用NEW或OLD進行引用

4)如果觸發動作體執行失敗,激活觸發器的事件就會終止執行,觸發器的目標表或觸發器可能影響的其他對象不發生任何變化

eg:當對錶SC的Grade屬性進行修改時,若分數增加了10%則將此次操作記錄到下面表中:

3. 激活觸發器
觸發器的執行,是由觸發事件激活的,並由數據庫服務器自動執行
一個數據表上可能定義了多個觸發器,遵循如下的執行順序:
(1) 執行該表上的BEFORE觸發器;
(2) 激活觸發器的SQL語句;
(3) 執行該表上的AFTER觸發器。

4. 刪除觸發器

觸發器必須是一個已經創建的觸發器,並且只能由具有相應權限的用戶刪除。

發佈了57 篇原創文章 · 獲贊 5 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章