数据库系统概论第五章

数据库完整性

数据库的完整性:
数据的正确性和相容性。防止数据库中存在不符合语义的数据,就是防止数据库存储不正确的数据。
防范对象:不合语义的,不正确的数据

数据的安全性:
保护数据库防止恶意破坏和非法的存取
防范对象:非法用户和非法操作

为了维护数据库的完整性,DBMS必须:
提供定义完整性约束条件的机制;
提供完整性检查的方法;
违约处理;

实体完整性:

  1. 关系模型的实体完整性:
    实体完整性(英语:Entity integrity)是在关系模型中,数据库完整性三项规则的 其中之一。实体完整性这项规则要求每个数据表都必须有主键,而作为主键的所有字段,其属性必须是独一及非空值
    CREATE TABLE中用PRIMARY KET定义

  2. 单属性构成的码有两种说明方法
    定义列级约束条件(在创建表时在某列上添加主键)
    定义位表级约束条件(在表后声明主键定义)

  3. 对多个属性构成的码只有以中说明条件
    定义位表级的约束条件
    数据库系统概论第五章
    单属性定义:
    数据库系统概论第五章
    多属性定义:
    数据库系统概论第五章

完整性检查和违约处理:
插入或对主码列进行更新操作时,RDBMS按照实体完整性规则自动进行检查。包括:
1.检查主码值是不是唯一,如果不唯一拒绝操作。(检查记录中主码的值是否唯一的一种方法时进行全表扫描,但效率低,,所有通常在主码上建立一个索引,以提高效率。)
2.检查主码的各个属性是否为空,只要有一个为空就拒绝插入或修改。

参照完整性

参照完整性定义
关系模型的参照完整性定义:
参照的完整性要求关系中不允许引用不存在的实体。与实体完整性是关系模型必须满足的完整性约束条件,目的是保证数据的一致性。参照完整性又称引用完整性。

在CREATE TABLE种用FOREIGN KEY短语定义哪些列为外码。
用REFERENCES短语指明这些外码参照哪些表的主码。
注意:参照完整性只能采用表级的定义。

参照完整性检查和违约处理:
数据库系统概论第五章
后两种拒绝执行可以设置为级联删除和级联修改。
1.拒绝(NO ACTION)执行(默认策略)
2.级联(CASCADE)操作
3.设置为空值(SET-NULL)
对于参照完整性,除了应该定义外码,还要定义外码列是否允许空值。
数据库系统概论第五章

用户定义的完整性:

用户定义的完整性就是针对某一具体应用的时间必须满足语义要求。
RDBMS提供,不必由程序承担。

属性上的约束条件定义:
CREATE TABLE时定义:
列值为非空(NOT NULL)
列值唯一(UNIQUE)
检查列值是否满足一个布尔表达式(CHECK,比如列值满足条件是男 女)
Ssex CHAR(2) CHECK (Ssex IN (‘男’,‘女’))

属性上的约束条件检查和违约处理:
插入元组或修改属性的值时,RDBMS检查属性上的约束条件是否被满足。
如果不满足则操作被拒绝执行。

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

如 当学生是性别男时,其名字不能以Ms.打头
数据库系统概论第五章
元组上的约束条件检查和违约处理:
插入元组或修改属性值时,RDBMS检查元组上的约束条件是否被满足
不满足就拒绝执行 NO ACTION

完整性约束命名子句:
通过CONSTRAINT约束
CONSTRAINT<完整性约束条件名>, (三种形式:)
[PRIMARY KEY短语
| FOREIGN KEY 短语
| CHECK 短语]
例如 建立学生等级表 ,要求学号在90000-99999之间,姓名不能取空值,年龄不能超过30岁,性别只能 男 女。
数据库系统概论第五章

修改表种完整性限制:
使用ALTER TABLE语句修改表种完整性约束。
修改表Student中的约束条件,比如把学号改为900000-999999之间,年龄由小于30改为40
可以删除原来的约束条件,添加新的条件
数据库系统概论第五章

域中的完整性约束

SQL支持域的概念,并可以用CREATE DOMAIN语句建立一个域以继该域应该满足的完整性约束条件。

建立一个性别域GenderDomain,并对其限制命名。
CREATE DOMAIN GenderDomain CHAR(2)
CONSTRAINT GD CHECK (VALUE IN (‘男’,‘女’));

删除域的限制条件
ALTER DOMAIN GenderDomain DROP CONSTRAINT GD;

增加域:
ALTER DOMAIN GenderDomai ADD CONSTRAIN GDD CHECK (VALUE IN (‘1’,‘0’) ;

触发器

触发器时用户定义在关系表上的一类由事件驱动的特殊过程
由服务器自动**。
可以进行更为复杂的检查和操作,具有更精细和更强大的数据控制能力。

比如当我修改学生表学号的时候,通过触发器,让年龄自动加1(虽然语义不合适,但是就是这么个意思)。

定义触发器:
语法格式:
CREATE TRIGGER<触发器名>
{BEFORE | AFTER} <触发事件> ON <表名>
FOR EACH {ROW | STATEMENT} { 对某一元组执行,还是一个语句执行)
[WHEN <触发条件>]
<触发动作体>

触发器语法说明
创建者:表的拥有着
触发器名
表名
触发事件:增删查改
触发器类型:
行级触发器(FOR EACH ROW) n次(n为元组数目)
语句级触发器(FOR EACH STAEMENT) 执行一次

**触发器
触发器的执行,是由触发器事件**的,并由数据库服务器自动执行。
一个数据表上可能定义了多个触发器
同一个表上多个触发器**时遵循如下顺序:
1.执行该表上的BEFORE触发器
2.**触发器的SQL语句;
3. 执行该表上的AFTER触发器。
数据库系统概论第五章

删除触发器
删除触发器SQL语法:
DROP TRIGGER<触发器名> ON <表名>
触发器必须是一个已经创建的触发器,并且只能由具有相应权限的用户删除。
数据库系统概论第五章