数据库完整性

1. 概述

数据库的完整性是指数据的正确性和相容性。数据的完整性是为了防止数据库中存在不符合语义的数据,也就是防止计算机中存在不确定的数据。数据的安全性是保护数据库防止恶意破坏和非法存取。

为了维护数据库的完整性,数据库管理系统必须能够实现:

  1. 提供定义完整性约束条件的机制。
  2. 提供完整性检查的方法。
  3. 进行违约处理。

2. 实体完整性

定义

关系模型的实体完整性在CREATE TABLE中用PRIMARY KEY定义。对单属性构成的码有两种说明方法,一种是定义为列级约束条件,另一种是定义为表级约束条件。对多个属性构成的码只有一种说明方法,即定义为表级约束条件。

检查和违约处理

用PRIMARY KEY短语定义了关系的主码后,每当用户程序对基本表插入一条记录或对主码列进行更新操作时,关系数据库管理系统将按照实体完整性规则自动进行检查。

(1) 实体完整性规则

检查主码值是否唯一,如果不唯一则拒绝插入或修改。

检查主码的各个属性是否为空,只要有一个为空就拒绝插入或修改。

(2) 检查方法

检查记录中主码值是否唯一有两种方法:

  • 全表扫描

依次判断表中每一条记录的主码值与将插入记录上的主码值(或者修改的新主码值)是否相同,这种方法很费时。

  • 在主码上自动建立一个B+树索引 

通过索引查找基本表中是否已经存在新的主码值,将大大提高效率。

3. 参照物完整性

定义

关系模型的参照物完整性在CREATE TABLE中用FOREIGN KEY短语定义哪些列为外码,用REFERENFCES短句指明这些外码参照哪些表的主码。

参照完整性检查和违规处理

参照完整性将两个表中的相应元组联系起来。因此,对被参照表和参照表进行增,删,改操作时可能破坏参照完整性,必须进行检查以保证这两个表的相容性。

当上述的不一致发生时,系统可以采用以下策略加以处理:

(1) 拒绝执行

不允许该操作执行,该策略一般设置为默认策略。

(2) 级联操作

当=删除或修改被参照表的一个元组导致与参照表的不一致时,删除或修改参照表中的所导致不一致的元组。

(3) 设置为空值

当删除或修改被参照的一个元组时造成了不一致,则将参照表中的所有造成不一致的元组的对应属性设置为空值。

4. 用户定义的完整性

用户定义的完整性就是针对某一具体应用的数据必须满足的语义要求。

(1) 属性上的约束条件

定义

在CREATE TABLE中定义属性的同时可以根据应用的要求,定义属性上的约束条件,即属性值限制,包括:

  1. 列值非空(NOT NULL短语)。
  2. 列值唯一(UNIQUE短语)。
  3. 检查列值是否满足一个布尔表达式(CHECK短句)。

检查和违约处理

当往表中插入元组或修改属性的值时,关系数据库管理系统就检查属性上的约束条件是否被满足,如果不满足则操作被拒绝执行。

(2)元组上的约束条件

定义

在CREATE TABLE语句中可以用CHECK短语定义元组上的约束条件,即元组级的限制。同属性值限制相比,元组级的限制可以设置不同属性之间的取值的相互约束条件。

检查和违约处理

当往表中插入元组或修改属性的值时,关系数据库管理系统将检查元组上的约束条件是否满足,如果不满足则操作被拒绝执行。

5. 完整性约束命名子句

SQL在CREATE TABLE语句中提供了完整性约束命名子句CONSTRAINT,用来对完整性约束条件命名,这可以灵活地增加,删除一个完整性约束条件。

(1) 完整性约束命名子句

CONSTRAINT<完整性约束条件名>[PRIMARY KEY短句|FOREIGN KEY短句|CHECK短句]

(2) 修改表中的完整性限制条件

使用ALTER TABLE语句可以修改表中的完整性限制,先删除原来的约束条件,再增加新的约束条件。

6. 域中的完整性限制

SQL支持域的概念,并可以用CREATE DOMAIN语句建立一个域以及该域应该满足的完整性约束条件,然后就可以用域来定义属性,这样定义的优点是,数据库中不同的属性可以是来自同一个域,当域上的完整性约束条件改变时只要修改域的定义即可,而不必一一修改域上的各个属性。

7. 断言

在SQL中可以使用数据定义语言中的CREATE ASSERTION语句,通过声明性断言来指定更具一般性的约束。可以定义涉及多个表或聚集操作的比较复杂的完整性约束。断言创建以来,任何对断言中所涉及关系的操作都会触发关系数据库管理系统对断言的检查,任何使断言不为真值的操作都会被拒绝执行。

(1) 创建断言的语句格式

CREATE ASSERTION<断言名><CHECK子句>

每个断言都被赋予一个名字,<CHECK子句>中的约束条件与WHERE子句的条件表达式类似。

(2) 删除断言的语法格式

DROP ASSERTOIN<断言名>

8. 触发器

触发器是用户定义在关系表上的一类由事件驱动的特殊过程。一旦定义,任何用户对表的增删改操作均由服务器自动激活相应的触发器,在DBMS核心层进行集的完整性空值。触发器类似于约束,但是比约束更加灵活,可以实施比FOREIGN KEY束,CHECK约束更为复杂的检查和操作,具有更精细和更强大的数据控制能力。

定义触发器

SQL使用CREATE TRIGGER命令建立触发器,其一般格式如下:

CREATE TRIGGER<触发器名>               /*每当触发器事件发生时,该触发器被激活*/
{BEFORE|AFTER}<触发事件>NO<表名>        /* 指明触发器激活的时间是在执行触发事件前或后*/
    REFERENCING NEW|OLD ROW AS<变量>   /* REFERNCING 指出引用的变量*/
    FOR EACH{ROW|STATEMENT}            /* 定义触发器的类型,指明动作体执行的频率*/
[WHEN<触发条件>]<触发动作体>            /* 仅当触发条件为真时才执行触发动作体*/

下面对定义触发器的各部分语法进行详细说明。

(1) 权限

表的拥有者即创建者的用户才可以在表上创建触发器,并且一个表上只能创建一定数量的触发器。

(2) 触发器名

触发器名可以包含模式名,也可以不包含模式名。在同一模式下,触发器名必须是唯一的;并且触发器名和<表名>必须在同一模式下。

(3) 表名

当这个表的数据发生变化时,将激活定义在该表上相应<触发事件>的触发器,因此,该表也称为触发器的目标表。

(4) 触发事件

触发事件可以是INSERT,DELETE,UPDATE,也可以是这几个事件的组合,如INSERT OR DELETE等。UPDATE后面还可以有OF<触发列...>,即进一步指明修改哪些列时触发器激活。

(5) 触发器类型

触发器按照所触发动作的间隔尺寸可以分为行级触发器和语句触发器。

(6) 触发事件

触发器被激活时,只有当触发条件为真时触发动作体才执行;否则触发动作体不执行。如果省略WHEN触发条件,则触发动作体在触发器激活后立即执行。

(7) 触发动作体

触发动作体即可以是一个匿名PL/SQL过程块,也可以是对己创建存储过程的调用。如果是行级触发器,在两种情况下,用户都可以在过程体中使用NEW和OLD引用UPDATE/INSERT事件之后的新值和UPDATE/DELETE事件之前的旧值。如果是语句级触发器,则不能在触发动作体中使用NEW和OLD进行引用。如果触发器动作体执行失败,激活触发器的事件就会终止执行,触发器的目标表或触发器可能影响的其他对象不发生任何变化。

激活触发器

触发器的执行是由触发事件激活,并由数据库服务器自动执行。一个数据表上可以定义了多个触发器,如多个BEFORE触发器,多个AFTER触发器等,同一个表上的多个触发器激活时遵循如下的执行顺序:

  1. 执行该表上的BEFORE触发器。
  2. 激活触发器的SQL语句。
  3. 执行该表上的AFTER触发器。

对于同一个表上的多个BEFORE(AFTER)触发器,遵循“谁先创建谁先执行”的原则,即按照触发器创建的时间先后顺序执行。有些关系数据库管理系统是按照触发器名称的字母顺序执行触发器。

删除触发器

删除触发器的SQL语句如下:

DROP TRIGGER<触发器名>ON<表名>

触发器必须是一个已经创建的触发器,并且只能由具有相应权限的用户删除。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Xclincer

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值