第5章 数据库完整性
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第5章数据库安全性(2课时)
数据库的数据保护主要包括数据的安全性和数据的完整性。数据的安全性是为了保护数据库防止恶意的破坏和非法访问,防范对象是非法用户和非法操作。数据库的完整性是指数据的正确性和相容性,是为了防止数据库中存在不符合语义的数据,也就是防止数据库中存在不正确的数据,防范对象是不合语义的、不正确的数据。
举例说明数据的完整性(三种完整性各一例)。
为维护数据库的完整性,DBMS必须具备三个功能:
1 提供定义完整性约束条件的机制
完整性约束条件也称为完整性约束规则,是数据库必须满足的语义约束条件。
SQL标准使用了一系列概念来描述完整性,包括关系模型的实体完整性、参照完整性和用户定义完整性。这些完整性一般由SQL的DDL语句来实现。它们作为数据库模式的一部分存入数据字典中。
2 提供完整性检查的方法
DBMS中检查数据是否满足完整性约束条件的机制称为完整性检查。
一般在INSERT、UPDA TE、DELETE语句执行后开始检查,也可以在事务提交时检查。检查这些操作执行后数据库中的数据库是否违背了完整性约束条件。
3 违约处理
DBMS若发现用户的操作违背了完整性约束条件,就采取一定的动作,如拒绝(NOACTION)执行该操作,或级联(CASCADE)执行其他操作,进行违约处理以保证数据的完整性。
目前商用的DBMS产品都支持完整性控制,即完整性定义、检查控制和违约处理都是由DBMS来实现,不必由应用程序来完成,从而减轻了应用程序员的负担。
5.1 实体完整性
是关系的两个不变性之一,关系的主属性的取值不能相同,主属性不能取空值,保证在一个关系中不存在两个完全相同的元组。
5.1.1 实体完整性定义
关系模型的实体完整性在CREATE TABLE中用PRIMARY KEY定义。对单属性构成的码有两种说明方法:一种是定义为列级约束条件;一种是定义为表级约束条件。对多个属性构成的码只有一种说明方法:定义为表级约束条件。
确定主属性:能唯一标识表中的一条记录。
例1:将Student表中的Sno属性定义为码
定义为列级约束条件
CREATE TABLE Student
(Sno CHAR(9) PRIMARY KEY,
Sname CHAR(20) NOT NULL,
Ssex CHAR(2),
Sage SMALLINT,
Sdept CHAR(20)
);
定义为表级约束条件
CREATE TABLE Student
(Sno CHAR(9),
Sname CHAR(20) NOT NULL,
Ssex CHAR(2),
Sage SMALLINT,
Sdept CHAR(20),
PRIMARY KEY(Sno)
);
例2:将SC表中的Sno,Cno属性组定义为码
CREATE TABLE SC
(Sno CHAR(9) NOT NULL,
Cno CHAR(4) NOT NULL,
Grade SMALLINT,
PRIMARY KEY (Sno, Cno)/*只能在表级定义主码*/
);
5.1.2 实体完整性检查和违约处理
定义了关系的主码后,当用户对基本表插入记录或者对主码列进行更新操作时,RDBMS 将按照实体完整性规则(p49)自动进行检查:
✧检查主码值是否唯一,如果不唯一则拒绝插入或修改。
✧检查主码的各个属性是否为空,只要有一个为空就拒绝插入或修改。
检查主码值是否唯一是十分耗时的(如果是全表扫描),RDBMS一般都在主码上自动建立一个索引,提高检查效率。
5.2 参照完整性
现实世界中的实体往往存在某种联系,在关系模型中实体及实体间的联系都用关系来描述(一对一和一对多联系一般隐含在基本表中,多对多联系要拆分,要形成一个联系表)。这样就自然存在关系与关系的引用。参照完整性就是实现这种引用规则。要求外码的取值只是被参照表主码的值或者取空值。
5.2.1 参照完整性定义
关系模型的参照完整性在CREATE TABLE中用FOREIGN KEY短语定义哪些列为外码,用REFERENCES短语指明这些外码参照哪些表的主码。
确定外码及其参照关系:该属性列的取值依赖于另一个表的主属性。
例3:定义SC中的参照完整性。
CREATE TABLE SC
(Sno CHAR(9) NOT NULL,
Cno CHAR(4) NOT NULL,
Grade SMALLINT,
PRIMARY KEY (Sno, Cno),
FOREIGN KEY (Sno) REFERENCES Student(Sno), /*在表级定义参照完整性*/
FOREIGN KEY (Cno) REFERENCES Course(Cno) /*在表级定义参照完整性*/
);
5.2.2 参照完整性检查和违约处理
参照完整性将两个表中的相应元组联系起来,因此,对被参照表和参照表进行增删改操作时都有可能破坏参照完整性。
对于参照表(例如学生选课数据库中的Sc表):插入,修改外键值。
对于被参照表(例如学生选课数据库中的Student表):修改主属性,删除元组。
当上述的不一致发生时,系统对违约的处理:
✧拒绝(NO ACTION)执行默认策略。
✧级联(CASCADE)操作当删除或修改被参照表的一个元组时造成了与参照表的