DBMS数据控制功能:完整性,安全性,数据库恢复,并发控制
数据库的完整性,通过过对数据库中的数据进行语义定义来实现
语义完整性和事务完整性,事务完整性包括并发控制和恢复技术,语义完整性是指数据库中的数据必须始终满足语义约束
数据库的安全性
保护数据库,防止数据库中的数据被破坏和存取
数据库的完整性
包括了数据的正确性和数据的相容性
数据的正确性:是指数据是符合现实世界语义的
数据的相容性:是指数据库同一对象在不同关系表中的数据是符合逻辑的,即不同数数据对象是有着符合逻辑的关系
为维护数据库的完整性,数据库管理系统必须:
1.提供定义完整性约束条件的机制
完整性约束条件也叫做完整性规,是一种语义约束条件,包括了实体完整性、参照完整性、用户定义完整性
2.提供完整性检查的方法
3.违约处理
拒绝(NO ACTION)执行该操作
级连(CASCADE)执行其他操作
实体完整性定义
关系模型的实体完整性
CREATE TABLE中用PRIMARY KEY定义
单属性构成的码有两种说明方法
定义为列级约束条件、定义为表级约束条件
对多个属性构成的码只有一种说明方法
定义为表级约束条件
实体完整性检查和违约处理
对主码列进行插入或更新操作时,RDBMS按照实体 完整性规则自动进行检查
- 检查主码值是否唯一,如果不唯一则拒绝插 入或修改
- 检查主码的各个属性是否为空,只要有一个 为空就拒绝插入或修改
参照完整性的定义
关系模型的参照完整性定义
在CREATE TABLE中用FOREIGN KEY短语定义哪些列为外码
用REFERENCES短语指明这些外码参照哪些表的主码
参照完整性检查和违约处理
①参照表插入元组可能破坏被参照表的参照完整性,因此拒绝处理
②参照表修改外码的值可能破坏被参照表的参照完整性,因此拒绝操作
③被参照表删除元组可能破坏参照表的参照完整性,因此拒绝/级连删除/设置为空值
④被参照表修改主码值可能破坏参照表的参照完整性,因此拒绝/级连修改/设置为空值
违约处理
参照完整性违约处理 - 拒绝(NO ACTION)执行,默认策略
- 级联(CASCADE)操作 ,需要进行一系列相关操作,保证数据的一致性
- 设置为空值(SET-NULL),对于参照完整性,除了应该定义外码,还应定义外码列是否允许空值
约束条件的定义
CREATE TABLE时定义
列值非空(NOT NULL)
列值唯一(UNIQUE)
检查列值是否满足一个布尔表达式(CHECK)
约束条件检查和违约处理
插入元组或修改属性的值时,RDBMS检查属性上的约束条件是否被满足
如果不满足则操作被拒绝执行
完整性约束命名子句
CONSTRAINT—对完整性约束条件命名
CONSTRAINT <完整性约束条件名>
[PRIMARY KEY短语 |FOREIGN KEY短语 |CHECK短语]
作用:可灵活地增加、删除完整性约束条件
例 建立学生登记表Student,要求学号在90000~99999之间,姓名不能取空值,年龄小于30,性别只能是“男”或“女”
CREATE TABLE Student
(Sno NUMERIC(6) CONSTRAINT C1 CHECK (Sno BETWEEN 90000 AND 99999),
Sname CHAR(20) CONSTRAINT C2 NOT NULL,
Sage NUMERIC(3) CONSTRAINT C3 CHECK (Sage < 30),
Ssex CHAR(2) CONSTRAINT C4 CHECK (Ssex IN ( '男','女')),
CONSTRAINT StudentKey PRIMARY KEY(Sno)
);
在Student表上建立了5个约束条件,包括主码约束(命名为StudentKey)以及C1、C2、C3、C4四个列级约束
修改表中的完整性限制
使用ALTER TABLE语句修改表中的完整性限制
ALTER TABLE 表名
DROP CONSTRAINT 已定义的约束;
ALTER TABLE 表名
ADD CONSTRAINT定义一个新的约束条件;
例 修改表Student中的约束条件,要求学号改为在900000~999999之间,年龄由小于30改为小于40可以先删除原来的约束条件,再增加新的约束条件
ALTER TABLE Student DROP CONSTRAINT C1;
ALTER TABLE Student ADD CONSTRAINT C1 CHECK (Sno BETWEEN 900000 AND 999999);
ALTER TABLE Student DROP CONSTRAINT C3;
ALTER TABLE Student ADD CONSTRAINT C3 CHECK (Sage < 40);
域中的完整性限制
域是一组具有相同数据类型的值的集合
如:性别的取值范围是{‘男’,‘女’}
用CREATE DOMAIN语句建立一个域以及该域应该满足的完整性约束条件
例 建立一个性别域GenderDomain,并对约束命名
CREATE DOMAIN GenderDomain CHAR(2)
CONSTRAINT GD CHECK ( VALUE IN ('男','女') );
断言
可以定义涉及多个表的或聚集操作的比较复杂的完 整性约束
例 限制数据库课程最多60名学生选修
CREATE ASSERTION ASSE_SC_DB_NUM
CHECK (60 >= (select count(*)
From Course,SC
Where SC.Cno=Course.Cno and
Course.Cname ='数据库') )
例 一个电影资料库假定有3个基本表:电影表Movie、演员表Actor和电影主演表Acts。其中Movie的属性包括电影名(Title)、制作年份(Year)、长度(Length)、颜色 (isColor)等;Actor属性包括演员名(Name)、地址 (Address)、性别(Sex)、出生年份(BirthYear)等;Acts 包括电影名(movieTitle)、制作年份(MovieYear)、演员 姓名(ActorName)等
写出创建上述三个表的SQL语句,要求:
①有主键、外键约束及相关完整性约束
②电影表中的年份不能在1895年以前
③电影长度不能短于60分钟,也不能长于240分钟
④1939年以前制作的电影不会是彩色的
⑤演员不会出现在他们出生之前的电影中
CREATE TABLE Movie(
Title CHAR(30),
Year INT CHECK(Year>=1895),
Length INT CHECK(Length>=60 AND Length<=240),
isColor CHAR(3) CHECK(isColor in(‘YES’,’NO’)),
PRIMARY KEY(Title,Year),
CHECK(isColor=’NO’ OR Year>=1939));
CREATE TABLE Actor(
Name CHAR(20) PRIMARY KEY,
Address VARCHAR(30),
Sex CHAR(6) CHECK(Sex in (‘male’,female’)),
BirthYear INT,
CHECK(Name NOT IN(SELECT ActorName FROM Acts) OR
BirthYear<ALL(SELECT MovieYear FROM Acts WHERE ActorName=Name))
);
CREATE TABLE Acts(
MovieTitle CHAR(30),
MovieYear INT,
ActorName CHAR(20),
PRIMARY KEY (MovieTitle,MovieYear,ActorName),
FOREIGN KEY (MovieTitle,MovieYear) REFERENCES Movie(Title,Year),
FOREIGN KEY(ActorName) REFERENCES Actor(Name),
CHECK (MovieYear>(SELECT BirthYear FROM Actor
WHERE Name=ActorName))
);