【数据库系统】数据库系统概论====第五章 数据库完整性

【数据库系统】数据库系统概论====第五章 数据库完整性

  1. 数据库完整性介绍
    数据库的完整性是指数据的正确性和相容性。
    数据的正确性是指数据是符合现实世界语义,反映了当前实际状况的。
    数据的相容性是指数据库同一对象在不同关系表中的数据是否符合逻辑的。
  2. 数据的完整性和安全性概念
    (1)数据的完整性
    防止数据库中存在不符合语义的数据,也就是防止数据库中存在不正确的数据。
    防范对象:不合语义的、不正确的数据
    (2)数据的安全性
    保护数据库防止恶意的破坏和非法的存取。
    防范对象:非法用户和非法操作。
  3. 数据库在完整性方面应具备的功能
    (1)提供定义完整性约束条件的机制
    完整性约束条件也称为完整性规则,是数据库中的数据必须满足的语义约束条件。SQL标准通过数据定义语言来描述完整性,包括关系模型的实体完整性、参照完整性和用户定义完整性。
    (2)提供完整性检查的方法
    数据库管理系统中检查数据是否满足完整性约束条件的机制称为完整性检查。一般在INSERT、UPDATE、DELETE语句执行后开始检查,也可以在事务提交时检查。
    (3)违约处理
    数据库管理系统若发现用户的操作违背了完整性约束条件,就采取拒绝(NO ACTION)执行该操作或级联(CASCADE)执行其他操作等方式保证完整性。

5.1实体完整性

5.1.1实体完整性定义
  1. 关系模型的实体完整性
    设置主码,让每条记录是相互可区分的,SQL中在CREATE TABLE中用PRIMARY KEY定义。
  2. 主码是单属性构成的有两种说明方法
    定义为列级约束条件
    定义为表级约束条件
  3. 主码是多属性的只能有一种说明方法
    定义为表级约束条件
5.1.2实体完整性检查和违约处理
  1. 完整性检查的内容
    关系数据库管理系统按照实体完整性规则自动进行检查。检查内容主要包括:
    (1)检查主码值是否唯一,如果不唯一则拒绝插入或修改。
    (2)检查主码的各个属性是否为空,只要有一个为空就拒绝插入或修改。
  2. 检查主码值方法
    检查记录中主码值是否唯一的一种方法是进行全表扫描。即依次判断表中每一条记录的主码值与将插入记录上的主码值(或者修改的新主码值)是否相同。
    在这里插入图片描述
    说明:
    ①全表扫描的缺点是十分耗时。
    ②为避免对基本表进行全表扫描,RDBMS核心一般都在主码上自动建立一个索引。例如B+树索引。
    在这里插入图片描述

5.2参照完整性

5.2.1参照完整性定义

参照完整性定义:
在CREATE TABLE中用FOREIGN KEY定义哪些列为外码,用REFERENCES短语指明这些外码参照哪些表的主码。

5.2.2参照完整性检查和违约处理

一个参照完整性将两个表中的相应元组联系起来,对被参照表和参照表进行增删改操作时都有可能破坏参照完整性,必须进行完整性检查。
参照完整性违约处理规则:
①拒绝(NO ACTION)执行。不允许该操作执行。该策略一般设置为默认策略。
②级联(CASCADE)操作。当删除或修改被参照表的一个元组造成了与参照表的不一致,则删除或修改参照表中的所有造成不一致的元组。
③设置为空值(SET-NULL)。当删除或修改被参照表的一个元组时造成了不一致,则将参照表中的所有造成不一致的元组的对应属性设置为空值。

5.3用户定义的完整性

用户定义的完整性:针对某一具体应用的数据必须满足的语义要求。用户定义的完整性由关系数据库管理系统提供了定义和检验用户定义完整性的机制,不必由应用程序承担。

5.3.1属性上的约束条件
  1. 属性上约束条件的定义
    CREATE TABLE时定义属性上的约束条件包括:列值非空(NOT NULL)、列值唯一(UNIQUE)、检查列值是否满足一个条件表达式(CHECK)。
    (1)不允许取空值
    (2)列值唯一
    (3)用CHECK短语指定列值应该满足的条件
  2. 属性上的约束条件检查和违约处理
    插入元组或修改属性的值时,关系数据库管理系统检查属性上的约束条件是否被满足,如果不满足则操作被拒绝执行。
5.3.2元组上的约束条件
  1. 元祖上约束条件的定义
    (1)在CREATE TABLE时可以用CHECK短语定义元组上的约束条件,即元组级的限制。
    (2)元组级的限制可以设置不同属性之间的取值的相互约束条件。
  2. 元组上约束条件检查和违约处理
    插入元组或修改属性的值时,关系数据库管理系统检查元组上的约束条件是否被满足,如果不满足则操作被拒绝执行。

5.4完整性约束命名子句

  1. 完整性约束命名子句
    格式:
    CONSTRAINT <完整性约束条件名> <完整性条件约束>
    <完整性约束条件> 包括NOT NULL、UNIQUE、PRIMARY KEY短语、FOREIGN KEY短语、CHECK短语等。
  2. 修改表中的完整性限制
    使用ALTER TABLE语句修改表中的完整性限制

5.5域中的完整性限制

域是一组具有相同数据类型的值的集合,即属性的取值范围。
SQL可以用CREATE DOMAIN语句建立一个域以及域应该满足的完整性约束条件,然后用域定义属性。

5.6断言

  1. 创建断言的语句格式
    CREATE ASSERTION<断言名><CHECK子句>
    每个断言都被赋予一个名字,<CHECK子句>中的约束条件与WHERE子句的条件表达式类似。
  2. 删除断言
    语句格式为:DROP ASSERTION<断言名>;
    如果断言很复杂,则系统在检测和维护断言的开销较高,这是在使用断言时应该注意的。

5.7触发器

触发器(Trigger)定义:触发器是用户定义在关系表上的一类由事件驱动的特殊过程。
说明:
①触发器保存在数据库服务器中。
②任何用户对表的增、删、改操作均由服务器自动**相应的触发器。
③触发器可以实施更为复杂的检查和操作,具有更精细和更强大的数据控制能力。

5.7.1定义触发器

触发器又叫做”事件-条件-动作“规则。

  1. 语句格式为:
    CREATE TRIGGER <触发器名>
    {BEFORE | AFTER} <触发事件> ON <表名>
    REFERENCING NEW | OLD ROW AS <变量>
    FOR EACH {ROW | STATEMENT}
    [WHEN <触发条件>] <触发动作体>
    说明:
    当特定的系统事件发生时,对规则的条件进行检查,如果条件成立则执行规则中动作,否则不执行该动作。规则中的动作体可以很复杂,通常是一段SQL存储过程。
  2. 定义触发器的语法说明
    (1)表的拥有者才可以在表上创建触发器。
    (2)触发器名:
    触发器名可以包含模式名,也可以不包含模式名。
    同一模式下,触发器名必须是唯一的。
    触发器名和表名必须在同一模式下。
    (3)表名:
    触发器只能定义在基本表上,不能定义在视图上。
    当基本表的数据发生变化时,将**定义在该表上相应触发事件的触发器。
    (4)触发事件
    ①INSERT、DELETE或UPDATE也可以是这几个事件的组合。
    ②UPDATE OF<触发列,…>,即进一步指明了修改哪些列时**触发器。
    ③AFTER/BEFORE是触发的时机。
    AFTER表示在触发事件的操作执行之后**触发器。
    BEFORE表示在触发事件的操作执行之前**触发器。
    (5)触发器类型
    行级触发器(FOR EACH ROW)和语句级触发器(FOR EACH STATEMENT)。
    (6)触发条件
    触发器被**时,只有当触发条件为真时触发动作体才执行;否则触发动作体不执行。
    如果省略WHEN触发条件,则触发动作体在触发器**后立即执行。
    (7)触发动作体
    ①触发动作体可以是一个匿名PL/SQL过程块,也可以是对已创建存储过程的调用。
    ②如果是行级触发器,用户都可以在过程体中使用NEW和OLD引用事件之后的新值和事件之间的旧值。
    ③如果是语句级触发器,则不能在触发动作体中使用NEW或OLD进行引用。
    ④如果触发动作体执行失败,**触发器的事件就会终止执行,触发器的目标表或触发器可能影响的其他对象不发生任何变化。
    注意:不同的RDBMS产品触发器语法各不相同。
5.7.2**触发器

触发器的执行,是由触发事件**的,并由数据库服务器自动执行。
一个数据表上可能定义了多个触发器,遵循如下的执行顺序;
(1)执行该表上的BEFORE触发器;
(2)**触发器的SQL语句;
(3)执行该表上的AFTER触发器。

5.7.3删除触发器

删除触发器的SQL语法:
DROP TRIGGER <触发器名> ON <表名>;
触发器必须是一个已经创建的触发器,并且只能由具有相应权限的用户删除。

5.8小结

  1. 数据库的完整性是为了保证数据库中存储的数据是正确的。最重要的完整性是实体完整性和参照完整性。
  2. 完整性定义一般由SQL的数据定义语言完成。目前数据库提供了完整性的定义和检查。
  3. 违背完整性约束条件时RDBMS一般采取默认动作,如拒绝执行。
  4. 触发器是保证数据库完整性的一个重要的方法。