SQL中的完整性约束规则有主键约束、外键约束、属性值约束和全局约束等多种形式。
△主键约束。它是数据中最重要的一种约束。在关系中主键值不允许空,也不允许出现重复, 体现了关系要满足实体完整性规则。主键可用主键子句或主键短语进行定义。
△外键约束。根据参照完整性规则,依赖关系中外键或者为空值, 或者是基本关系(参照关系)中的该键的某个值。外键用外键关系子句定义, 并考虑删除基本关系元组或修改基本关系的主键值的影响,依赖关系可按需要采用RESTRICT、SET NULL、CASCADE方式。 △属性值约束。当要求某个属性的值不允许空值时,那么可以在属性定义后加上关键字:NOT NULL , 这是非空值约束。还可以用CHECK子句对一个属性值加以限制以及使用域约束子句CREAT DOMAIN 定义新域并加以属性值检查。
△全局约束。在关系定义时,可以说明一些比较复杂的完整性约束,这些约束涉及到多个属性间的联系 或不同关系间的联系,称为全局约束。主要有基于元组的检查子句和断言。 前者是对单个关系的元组值加以约束,后者则可对多个关系或聚合操作有关的完整性约束进行定义。
6.17 参照完整性规则在SQL可以用哪几种方式实现?删除基本关系的元组时, 依赖关系可以采取的做法有哪三种?修改基本关系的主键值时,依赖关系可以采取的做法有哪三种?
参照完整性规则要求\不引用不存在的实体\,参照完整性规则在SQL可用以下几种方式实现:
(1)在SQL中采用外键子句定义外键,并考虑删除基本关系元组或修改基本关系的主键值, 对依赖关系产生的影响;
(2)在属性值上进行约束如基于属性的检查; (3)全局约束中的基于元组的检查子句等。
删除基本关系元组或修改基本关系的主键值时,依赖关系可以采用的做法有:
△RESTRICT方式:只有当依赖关系中没有一个外键值与基本关系中要删除/修改的主键值相对应时, 系统才能执行删除/修改操作,否则拒绝删除或修改。
△SET NULL方式:删除基本元组时,将依赖关系中所有与基本关系中被删除主键值相对应的外键值置为空值。 修改基本关系的主键值时,将依赖关系中所有与基本关系中被修改主键值相对应的外键值置为空值。
△CASCADE方式:若删除则将依赖关系中所有外键值与基本关系中要删除的主键值相对应的元组一并删除, 若修改则将依赖关系中所有与基本关系中要修改的主键值相对应的外键值一并修改为新值。
6.18 试对SQL2中的基于属性的检查约束、基于元组的检查约束和断言 三种完整性约束进行比较:各说明什么对象?何时激活?能保证数据库的一致性吗?
约束形式 基于属性的检查 说明对象 激活条件 是否保证一致性 不一定 不一定 保证 只对一个属性值加以约束 插入或修改属性值时 基于元组的检查 对单个关系的元组值加以约束 在插入或修改元组时 断言 多个关系或聚合操作 任何变动
6.19 设教学数据库的模式如下: S(S#,SNAME,AGE,SEX) SC(S#,C#,GRADE) C(C#,CNAME,TEACHER)
试用多种方式定义下列完整性约束:
(1)在关系S中插入学生年龄值应在16~25岁之间
(2)在关系SC中插入元组时,其S#值和C#值必须分别在S和C中出现。 (3)在关系SC中修改GRADE值时,必须仍在0~100之间。
(4)在删除关系C中一个元组时,首先要把关系SC中具有同样C#的元组全部删去。 (5)在关系S中把某个S#值修改为新值时,必须同时把关系SC中那些同样的S#值也修改为新值。
(1)定义S时采用检查子句: CREAT TABLE S( S# CHAR(4),
SNAME char (10) NOT NULL , AGE SMALLINT , PRIMARY key(S#),
CHECK (AGE>=16 and AGE<=25) )
(2)采用外键子句约束 CREAT TABLE SC( S# CHAR(4), C# CHAR(4), GRADE SMALLINT,
FOREIGN key(S#) REFERENCE S(S#), FOREIGN key(C#) REFERENCE C(C#) )
(3)采用元组检查 CREAT TABLE SC( S# CHAR(4), C# CHAR(4), GRADE SMALLINT,
FOREIGN key(S#) REFERENCE S(S#), FOREIGN key(C#) REFERENCE C(C#), CHECK (GRADE>=0 and AGE<=100) )
(4)采用外键约束 CREAT TABLE SC(
S# CHAR(4), C# CHAR(4), GRADE SMALLINT,
FOREIGN key(S#) REFERENCE S(S#), FOREIGN key(C#) REFERENCE C(C#) )
若改为:在删除关系C中一个元组时,同时把关系SC中具有同样C#的元组全部删去,则为: ......
FOREIGN key(C#) REFERENCE C(C#) ON DELETE CASCADE ......
(5)采用外键约束 CREAT TABLE SC( S# CHAR(4), C# CHAR(4), GRADE SMALLINT,
FOREIGN key(S#) REFERENCE S(S#) ON UPDATE CASCADE , FOREIGN key(C#) REFERENCE C(C#) )
6.20 在教学数据库的关系S、SC、C中,试用SQL2的断言机制定义下列两个完整性约束: (1)学生必须在选修Maths课后,才能选修其他课程。 (2)每个男学生最多选修20门课程
(1)
CREAT ASSERTION ASSE1 CHECK ( NOT EXISTS
( SELECT S FROM SC WHERE C# IN (SELECT C# FROM C
WHERE CNAME<>'MATHS') AND S# NOT IN
(SELECT S# FROM SC WHERE C# IN (SELECT C# FROM C
WHERE CNAME='MATHS'))); (2)
CREAT ASSERTION ASSE2 CHECK ( ALL(SELECT COUNT (SC.C#) FROM S,SC
WHERE S.S#=SC.S AND SEX='M' GROUP BY S#)<=20);
6.21 什么是数据库的安全性?有哪些安全措施?
数据库的安全性是指保护数据库防止不合法的使用,以免数据的泄漏、非法更改和破坏。 可以从以下方面设置数据库的安全措施:环境级、职员级、OS级、网络级和数据库系统级。 (具体可参见教材P173)
6.22 对银行的数据库系统应采取哪些安全措施?分别属于哪一级?
答案基本同上一题。
6.23 什么是\权限\用户访问数据库可以有哪些权限?对数据库模式有哪些修改权限?