null广东工业大学计算机学院广东工业大学计算机学院数据库系统概论
An Introduction to Database System
第五章 数据库完整性数据库完整性数据库完整性什么是数据库的完整性
数据的正确性和相容性
防止不合语义的数据进入数据库。
例: 学生的年龄必须是整数,取值范围为14--29;
学生的性别只能是男或女;
学生的学号一定是唯一的;
学生所在的系必须是学校开设的系;
完整性:否真实地反映现实世界
数据的完整性和安全性是两个不同概念
数据的完整性
防止数据库中存在不符合语义的数据,也就是防止数据库中存在不正确的数据
防范对象:不合语义的、不正确的数据
数据的安全性
保护数据库防止恶意的破坏和非法的存取
防范对象:非法用户和非法操作数据库完整性(续)数据库完整性(续)为维护数据库的完整性,DBMS必须:
1.提供定义完整性约束条件的机制
2.提供完整性检查的方法
3.违约处理
——完整性控制机制第五章 数据库完整性第五章 数据库完整性5.1 实体完整性
5.2 参照完整性
5.3 用户定义的完整性
5.4 完整性约束命名字句
*5.5 域中的完整性限制
5.6 触发器
5.7 小结
5.1 实体完整性5.1 实体完整性5.1.1 实体完整性定义
5.1.2 实体完整性检查和违约处理5.1.1 实体完整性定义5.1.1 实体完整性定义关系模型的实体完整性
CREATE TABLE中用PRIMARY KEY定义
单属性构成的码有两种说明方法
定义为列级约束条件
定义为表级约束条件
对多个属性构成的码只有一种说明方法
定义为表级约束条件 实体完整性定义(续)实体完整性定义(续)[例1] 将Student表中的Sno属性定义为码
(1)在列级定义主码
CREATE TABLE Student
(Sno CHAR(9) PRIMARY KEY,
Sname CHAR(20) NOT NULL,
Ssex CHAR(2) ,
Sage SMALLINT,
Sdept CHAR(20));实体完整性定义(续)实体完整性定义(续)(2)在表级定义主码
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,修课成绩Grade组成,其中(Sno, Cno)为主码。
CREATE TABLE SC
(Sno CHAR(9) NOT NULL,
Cno CHAR(4) NOT NULL,
Grade SMALLINT,
PRIMARY KEY (Sno,Cno) /*只能在表级定义主码*/
); 5.1 实体完整性5.1 实体完整性5.1.1 实体完整性定义
5.1.2 实体完整性检查和违约处理5.1.2 实体完整性检查和违约处理5.1.2 实体完整性检查和违约处理插入或对主码列进行更新操作时,RDBMS按照实体完整性规则自动进行检查。包括:
1. 检查主码值是否唯一,如果不唯一则拒绝插入或修改
2. 检查主码的各个属性是否为空,只要有一个为空就拒绝插入或修改
实体完整性检查和违约处理(续)实体完整性检查和违约处理(续)检查
记录
混凝土 养护记录下载土方回填监理旁站记录免费下载集备记录下载集备记录下载集备记录下载
中主码值是否唯一的一种方法是进行全表扫描实体完整性检查和违约处理(续)实体完整性检查和违约处理(续)索引 第五章 数据库完整性第五章 数据库完整性5.1 实体完整性
5.2 参照完整性
5.3 用户定义的完整性
5.4 完整性约束命名字句
*5.5 域中的完整性限制
5.6 触发器
5.7 小结
5.2 参照完整性5.2 参照完整性5.2.1 参照完整性定义
5.2.2 参照完整性检查和违约处理
5.2.1 参照完整性定义5.2.1 参照完整性定义关系模型的参照完整性定义
在CREATE TABLE中用FOREIGN KEY短语定义哪些列为外码
用REFERENCES短语指明这些外码参照哪些表的主码 参照完整性定义(续)参照完整性定义(续)例如,关系SC中一个元组表示一个学生选修的某门课程的成绩,(Sno,Cno)是主码。Sno,Cno分别参照引用Student表的主码和Course表的主码
[例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 参照完整性5.2 参照完整性5.2.1 参照完整性定义
5.2.2 参照完整性检查和违约处理
5.2.2 参照完整性检查和违约处理5.2.2 参照完整性检查和违约处理可能破坏参照完整性的情况及违约处理5.2.2 参照完整性检查和违约处理5.2.2 参照完整性检查和违约处理例:职工-部门数据库包含职工表EMP和部门表DEPT
1 DEPT关系的主码为部门号Deptno
2 EMP关系的主码为职工号Empno, 外码为部门号Deptno
称DEPT为被参照关系或目标关系,EMP为参照关系
RDBMS实现参照完整性时需要考虑以下4方面:
1. 外码是否可以接受空值的问题 1. 外码是否可以接受空值的问题外码是否能够取空值:依赖于应用环境的语义
实现参照完整性:
系统提供定义外码的机制
定义外码列是否允许空值的机制
5.2.2 参照完整性检查和违约处理1. 外码是否可以接受空值的问题1. 外码是否可以接受空值的问题例1:在职工-部门数据库中,
EMP关系包含有外码Deptno
某元组的这一列若为空值,表示这个职工尚未分配到任何具体的部门工作
和应用环境的语义是相符5.2.2 参照完整性检查和违约处理1. 外码是否可以接受空值的问题1. 外码是否可以接受空值的问题例2:学生-选课数据库
Student关系为被参照关系,其主码为Sno。
SC为参照关系,外码为Sno。
若SC的Sno为空值:表明尚不存在的某个学生,或者某个不知学号的学生,选修了某门课程,其成绩记录在Grade中
与学校的应用环境是不相符的,因此SC的Sno列不能取空值。5.2.2 参照完整性检查和违约处理2.在被参照关系中删除元组时的问题2.在被参照关系中删除元组时的问题出现违约操作的情形:
删除被参照关系的某个元组(student)
而参照关系有若干元组(SC)的外码值与被删除的被参照关系的主码值相同5.2.2 参照完整性检查和违约处理2.在被参照关系中删除元组时的问题2.在被参照关系中删除元组时的问题违约反应:可有三种策略
级联删除(CASCADES)
受限删除(RESTRICTED)
置空值删除(NULLIFIES)
这三种处理方法,哪一种是正确的,要依应用环境的语义来定5.2.2 参照完整性检查和违约处理2.在被参照关系中删除元组时的问题2.在被参照关系中删除元组时的问题级联删除
将参照关系中外码值与被参照关系中要删除元
组主码值相对应的元组一起删除
受限删除
当参照关系中没有任何元组的外码值与要删除
的被参照关系的元组的主码值相对应时,系统
才执行删除操作,否则拒绝此删除操作5.2.2 参照完整性检查和违约处理2.在被参照关系中删除元组时的问题2.在被参照关系中删除元组时的问题置空值删除
删除被参照关系的元组,并将参照关系
中与被参照关系中被删除元组主码值相
等的外码值置为空值。5.2.2 参照完整性检查和违约处理2.在被参照关系中删除元组时的问题2.在被参照关系中删除元组时的问题例:要删除Student关系中Sno=950001的元组,
而SC关系中有4个元组的Sno都等于950001。
级联删除:将SC关系中所有4个Sno=950001的元组一起删除。如果参照关系同时又是另一个关系的被参照关系,则这种删除操作会继续级联下去
受限删除:系统将拒绝执行此删除操作。5.2.2 参照完整性检查和违约处理2.在被参照关系中删除元组时的问题2.在被参照关系中删除元组时的问题置空值删除:将SC关系中所有Sno=950001的元组的Sno值置为空值。
在学生选课数据库中,显然第一种方法和第二种方法都是对的。第三种方法不符合应用环境语义。5.2.2 参照完整性检查和违约处理3.在参照关系中插入元组时的问题3.在参照关系中插入元组时的问题出现违约操作的情形
需要在参照关系中插入元组,而被参照关系不存在相应的元组
违约反应
受限插入
递归插入 5.2.2 参照完整性检查和违约处理3.在参照关系中插入元组时的问题3.在参照关系中插入元组时的问题受限插入
仅当被参照关系中存在相应的元组,其主码值与参照关系插入元组的外码值相同时,系统才执行插入操作,否则拒绝此操作。
递归插入
首先向被参照关系中插入相应的元组,其主码值等于参照关系插入元组的外码值,然后向参照关系插入元组。5.2.2 参照完整性检查和违约处理3.在参照关系中插入元组时的问题3.在参照关系中插入元组时的问题例:向SC关系插入(99001,1,90)元组,而Student关系中尚没有Sno=99001的学生
受限插入:系统将拒绝向SC关系插入(99001,1,90)元组
递归插入:系统将首先向Student关系插入Sno=99001的元组,然后向SC关系插入(99001,1,90)元组。5.2.2 参照完整性检查和违约处理4. 修改被参照关系中主码的问题4. 修改被参照关系中主码的问题两种策略
(1)不允许修改主码
(2)允许修改主码 5.2.2 参照完整性检查和违约处理允许修改主码策略允许修改主码策略违约操作
要修改被参照关系中某些元组的主码值,而参照关系中有些元组的外码值正好等于被参照关系要修改的主码值
要修改参照关系中某些元组的主码值,而被参照关系中没有任何元组的外码值等于被参照关系修改后的主码值5.2.2 参照完整性检查和违约处理允许修改主码策略允许修改主码策略违约反应 (1)
修改的关系是被参照关系:与删除类似
级联修改
受限修改
置空值修改5.2.2 参照完整性检查和违约处理允许修改主码策略允许修改主码策略级联修改
修改被参照关系中主码值同时,用相同的方法修改参照关系中相应的外码值。
受限修改
拒绝此修改操作。只当参照关系中没有任何元组的外码值等于被参照关系中某个元组的主码值时,这个元组的主码值才能被修改。
置空值修改
修改被参照关系中主码值,同时将参照关系中相应的外码值置为空值。5.2.2 参照完整性检查和违约处理允许修改主码策略允许修改主码策略 例:将Student关系中Sno=950001的元组中Sno值改为960123。而SC关系中有 4个元组的Sno=950001
级联修改:将SC关系中4个Sno=950001元组中的Sno值也改为960123。如果参照关系同时又是另一个关系的被参照关系,则这种修改操作会继续级联下去。5.2.2 参照完整性检查和违约处理允许修改主码策略允许修改主码策略受限修改:只有SC中没有任何元组的Sno=950001时,才能修改Student表中Sno=950001的元组的Sno值改为960123。
置空值修改:将Student表中Sno=950001的元组的Sno值改为960123。而将S表中所有Sno=950001的元组的Sno值置为空值。
在学生选课数据库中只有第一种方法是正确的。5.2.2 参照完整性检查和违约处理允许修改主码策略允许修改主码策略违约反应 (2)
修改的关系是参照关系:与插入类似
受限插入
递归插入5.2.2 参照完整性检查和违约处理参照完整性的实现参照完整性的实现RDBMS在实现参照完整性时:
需要向用户提供定义主码、外码的机制
向用户提供按照自己的应用要求选择处理依赖关系中对应的元组的方法5.2.2 参照完整性检查和违约处理违约处理违约处理[例4] 显式说明参照完整性的违约处理示例
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)
ON DELETE CASCADE /*级联删除SC表中相应的元组*/
ON UPDATE CASCADE, /*级联更新SC表中相应的元组*/
FOREIGN KEY (Cno) REFERENCES Course(Cno)
ON DELETE NO ACTION
/*当删除course 表中的元组造成了与SC表不一致时拒绝删除*/
ON UPDATE CASCADE
/*当更新course表中的cno时,级联更新SC表中相应的元组*/
);5.2.2 参照完整性检查和违约处理第五章 数据库完整性第五章 数据库完整性5.1 实体完整性
5.2 参照完整性
5.3 用户定义的完整性
5.4 完整性约束命名字句
*5.5 域中的完整性限制
5.6 触发器
5.7 小结5.3 用户定义的完整性5.3 用户定义的完整性用户定义的完整性就是针对某一具体应用的数据必须满足的语义要求
RDBMS提供,而不必由应用程序承担5.3 用户定义的完整性5.3 用户定义的完整性5.3.1 属性上的约束条件的定义
5.3.2 属性上的约束条件检查和违约处理
5.3.3 元组上的约束条件的定义
5.3.4元组上的约束条件检查和违约处理
5.3.1 属性上的约束条件的定义5.3.1 属性上的约束条件的定义CREATE TABLE时定义
列值非空(NOT NULL)
列值唯一(UNIQUE)
检查列值是否满足一个布尔表达式(CHECK)属性上的约束条件的定义(续)属性上的约束条件的定义(续)1.不允许取空值
[例5] 在定义SC表时,说明Sno、Cno、Grade属性不允许取空值。
CREATE TABLE SC
(Sno CHAR(9) NOT NULL,
Cno CHAR(4) NOT NULL,
Grade SMALLINT NOT NULL,
PRIMARY KEY (Sno, Cno),
/* 如果在表级定义实体完整性,隐含了Sno,Cno不允许取空值,则在列级不允许取空值的定义就不必写了 * /
); 属性上的约束条件的定义(续)属性上的约束条件的定义(续)2.列值唯一
[例6] 建立部门表DEPT,要求部门名称Dname列取值唯一,部门编号Deptno列为主码
CREATE TABLE DEPT
(Deptno NUMERIC(2),
Dname CHAR(9) UNIQUE,/*要求Dname列值唯一*/
Location CHAR(10),
PRIMARY KEY (Deptno)
);属性上的约束条件的定义(续)属性上的约束条件的定义(续)3. 用CHECK短语指定列值应该满足的条件
[例7] Student表的Ssex只允许取“男”或“女”。
CREATE TABLE Student
(Sno CHAR(9) PRIMARY KEY,
Sname CHAR(8) NOT NULL,
Ssex CHAR(2) CHECK (Ssex IN (‘男’,‘女’) ) ,
/*性别属性Ssex只允许取'男'或'女' */
Sage SMALLINT,
Sdept CHAR(20)
);5.3 用户定义的完整性5.3 用户定义的完整性5.3.1 属性上的约束条件的定义
5.3.2 属性上的约束条件检查和违约处理
5.3.3 元组上的约束条件的定义
5.3.4元组上的约束条件检查和违约处理
5.3.2 属性上的约束条件检查和违约处理5.3.2 属性上的约束条件检查和违约处理插入元组或修改属性的值时,RDBMS检查属性上的约束条件是否被满足
如果不满足则操作被拒绝执行 5.3 用户定义的完整性5.3 用户定义的完整性5.3.1 属性上的约束条件的定义
5.3.2 属性上的约束条件检查和违约处理
5.3.3 元组上的约束条件的定义
5.3.4元组上的约束条件检查和违约处理
5.3.3 元组上的约束条件的定义5.3.3 元组上的约束条件的定义在CREATE TABLE时可以用CHECK短语定义元组上的约束条件,即元组级的限制
同属性值限制相比,元组级的限制可以设置不同属性之间的取值的相互约束条件 元组上的约束条件的定义(续)元组上的约束条件的定义(续)[例9] 当学生的性别是男时,其名字不能以Ms.打头。
CREATE TABLE Student
(Sno CHAR(9),
Sname CHAR(8) NOT NULL,
Ssex CHAR(2),
Sage SMALLINT,
Sdept CHAR(20),
PRIMARY KEY (Sno),
CHECK (Ssex='女' OR Sname NOT LIKE 'Ms.%')
/*定义了元组中Sname和 Ssex两个属性值之间的约束条件*/
);
性别是女性的元组都能通过该项检查,因为Ssex=‘女’成立;
当性别是男性时,要通过检查则名字一定不能以Ms.打头5.3 用户定义的完整性5.3 用户定义的完整性5.3.1 属性上的约束条件的定义
5.3.2 属性上的约束条件检查和违约处理
5.3.3 元组上的约束条件的定义
5.3.4 元组上的约束条件检查和违约处理
5.3.4 元组上的约束条件检查和违约处理5.3.4 元组上的约束条件检查和违约处理插入元组或修改属性的值时,RDBMS检查元组上的约束条件是否被满足
如果不满足则操作被拒绝执行 第五章 数据库完整性第五章 数据库完整性5.1 实体完整性
5.2 参照完整性
5.3 用户定义的完整性
5.4 完整性约束命名子句
*5.5 域中的完整性限制
5.6 触发器
5.7 Oracle的完整性(补充)
5.8 小结
5.4 完整性约束命名子句5.4 完整性约束命名子句CONSTRAINT 约束
CONSTRAINT <完整性约束条件名>
[PRIMARY KEY短语
|FOREIGN KEY短语
|CHECK短语]
完整性约束命名子句(续)完整性约束命名子句(续)[例10] 建立学生登记表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四个列级约束。完整性约束命名子句(续)完整性约束命名子句(续)2. 修改表中的完整性限制
使用ALTER TABLE语句修改表中的完整性限制完整性约束命名子句(续)完整性约束命名子句(续)[例13] 修改表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);第五章 数据库完整性第五章 数据库完整性5.1 实体完整性
5.2 参照完整性
5.3 用户定义的完整性
5.4 完整性约束命名字句
*5.5 域中的完整性限制
5.6 触发器
5.7 Oracle的完整性(补充)
5.8 小结
5.5 域中的完整性限制5.5 域中的完整性限制SQL支持域的概念,并可以用CREATE DOMAIN语句建立一个域以及该域应该满足的完整性约束条件。
[例14]建立一个性别域,并声明性别域的取值范围
CREATE DOMAIN GenderDomain CHAR(2)
CHECK (VALUE IN ('男','女') );
这样[例10]中对Ssex的说明可以改写为
Ssex GenderDomain
[例15]建立一个性别域GenderDomain,并对其中的限制命名
CREATE DOMAIN GenderDomain CHAR(2)
CONSTRAINT GD CHECK ( VALUE IN ('男','女') );域中的完整性限制(续)域中的完整性限制(续)[例16]删除域GenderDomain的限制条件GD。
ALTER DOMAIN GenderDomain
DROP CONSTRAINT GD;
[例17]在域GenderDomain上增加限制条件GDD。
ALTER DOMAIN GenderDomain
ADD CONSTRAINT GDD CHECK (VALUE IN ( '1','0') );
通过[例16]和[例17],就把性别的取值范围由('男','女')改为 ( '1','0') 第五章 数据库完整性第五章 数据库完整性5.1 实体完整性
5.2 参照完整性
5.3 用户定义的完整性
5.4 完整性约束命名字句
*5.5 域中的完整性限制
5.6 触发器
5.7 Oracle的完整性(补充)
5.8 小结
触发器触发器触发器(Trigger)是用户定义在关系表上的一类由事件驱动的特殊过程
由服务器自动激活
可以进行更为复杂的检查和操作,具有更精细和更强大的数据控制能力 5.6 触发器5.6 触发器5.6.1 定义触发器
5.6.2 激活触发器
5.6.3 删除触发器
5.6.1 定义触发器5.6.1 定义触发器CREATE TRIGGER语法格式
CREATE TRIGGER <触发器名>
{BEFORE | AFTER} <触发事件> ON <表名>
FOR EACH {ROW | STATEMENT}
[WHEN <触发条件>]
<触发动作体>定义触发器(续)定义触发器(续)定义触发器的语法说明:
1. 创建者:表的拥有者
2. 触发器名
3. 表名:触发器的目标表
4. 触发事件:INSERT、DELETE、UPDATE
5. 触发器类型
行级触发器(FOR EACH ROW)
语句级触发器(FOR EACH STATEMENT)
定义触发器(续)定义触发器(续)例如,假设在[例11]的TEACHER表上创建了一个AFTER UPDATE触发器。如果表TEACHER有1000行,执行如下语句:
UPDATE TEACHER SET Deptno=5;
如果该触发器为语句级触发器,那么执行完该语句后,触发动作只发生一次
如果是行级触发器,触发动作将执行1000次
定义触发器(续)定义触发器(续)6. 触发条件
触发条件为真
省略WHEN触发条件
7. 触发动作体
触发动作体可以是一个匿名PL/SQL过程块
也可以是对已创建存储过程的调用定义触发器(续)定义触发器(续)[例18] 定义一个BEFORE行级触发器,为教师表Teacher定义完整性规则“教授的工资不得低于4000元,如果低于4000元,自动改为4000元”。
CREATE TRIGGER Insert_Or_Update_Sal
BEFORE INSERT OR UPDATE ON Teacher
/*触发事件是插入或更新操作*/
FOR EACH ROW /*行级触发器*/
AS BEGIN /*定义触发动作体,是PL/SQL过程块*/
IF (new.Job='教授') AND (new.Sal < 4000) THEN
new.Sal :=4000;
END IF;
END; 定义触发器(续)定义触发器(续)[例19]定义AFTER行级触发器,当教师表Teacher的工资发生变化后就自动在工资变化表Sal_log中增加一条相应记录
首先建立工资变化表Sal_log
CREATE TABLE Sal_log
(Eno NUMERIC(4) references teacher(eno),
Sal NUMERIC(7,2),
Username char(10),
Date TIMESTAMP
);定义触发器(续)定义触发器(续)[例19](续)
CREATE TRIGGER Insert_Sal
AFTER INSERT ON Teacher /*触发事件是INSERT*/
FOR EACH ROW
AS BEGIN
INSERT INTO Sal_log VALUES(
new.Eno,new.Sal,CURRENT_USER,CURRENT_TIMESTAMP);
END;
定义触发器(续)定义触发器(续)[例19](续)
CREATE TRIGGER Update_Sal
AFTER UPDATE ON Teacher /*触发事件是UPDATE */
FOR EACH ROW
AS BEGIN
IF (new.Sal <> old.Sal) THEN INSERT INTO Sal_log VALUES(
new.Eno,new.Sal,CURRENT_USER,CURRENT_TIMESTAMP);
END IF;
END;5.6 触发器5.6 触发器5.6.1 定义触发器
5.6.2 激活触发器
5.6.3 删除触发器
5.6.2 激活触发器5.6.2 激活触发器触发器的执行,是由触发事件激活的,并由数据库服务器自动执行
一个数据表上可能定义了多个触发器
同一个表上的多个触发器激活时遵循如下的执行顺序:
(1) 执行该表上的BEFORE触发器;
(2) 激活触发器的SQL语句;
(3) 执行该表上的AFTER触发器。激活触发器(续)激活触发器(续)[例20]执行修改某个教师工资的SQL语句,激活上述定义的触发器。
UPDATE Teacher SET Sal=800 WHERE Ename='陈平';
执行顺序是:
执行触发器Insert_Or_Update_Sal
执行SQL语句“UPDATE Teacher SET Sal=800 WHERE Ename='陈平';”
执行触发器Insert_Sal;
执行触发器Update_Sal 5.6 触发器5.6 触发器5.6.1 定义触发器
5.6.2 激活触发器
5.6.3 删除触发器
5.6.3 删除触发器5.6.3 删除触发器删除触发器的SQL语法:
DROP TRIGGER <触发器名> ON <表名>;
触发器必须是一个已经创建的触发器,并且只能由具有相应权限的用户删除。
[例21] 删除教师表Teacher上的触发器Insert_Sal
DROP TRIGGER Insert_Sal ON Teacher;第五章 数据库完整性第五章 数据库完整性5.1 实体完整性
5.2 参照完整性
5.3 用户定义的完整性
5.4 完整性约束命名字句
*5.5 域中的完整性限制
5.6 触发器
5.7 Oracle的完整性(补充)
5.8 小结
5.7 Oracle的完整性5.7 Oracle的完整性一、Oracle中的实体完整性
二、Oracle中的参照完整性
三、Oracle中用户定义的完整性一、ORACLE中的实体完整性一、ORACLE中的实体完整性ORACLE在CREATE TABLE语句中提供了PRIMARY KEY子句,供用户在建表时指定关系的主码列。
在列级使用PRIMARY KEY子句
在表级使用PRIMARY KEY子句
ORACLE中的实体完整性(续)ORACLE中的实体完整性(续)例1:在学生选课数据库中,要定义Student表的Sno属性为主码
CREATE TABLE Student
(Sno NUMBER(8),
Sname VARCHAR(20),
Sage NUMBER(20),
CONSTRAINT PK_SNO PRIMARY KEY (Sno));
或:
CREATE TABLE Student
(Sno NUMBER(8) PRIMARY KEY ,
Sname VARCHAR(20),
Sage NUMBER(20));ORACLE中的实体完整性(续)ORACLE中的实体完整性(续)例2:要在SC表中定义(Sno, Cno)为主码
CREATE TABLE SC
(Sno NUMBER(8),
Cno NUMBER(2),
Grade NUMBER(2),
CONSTRAINT PK_SC PRIMARY KEY (Sno, Cno));ORACLE中的实体完整性(续)ORACLE中的实体完整性(续)用户程序对主码列进行更新操作时,系统自动进行完整性检查
违约操作
使主属性值为空值的操作
使主码值在表中不唯一的操作
违约反应
系统拒绝此操作,从而保证了实体完整性二、ORACLE中的参照完整性二、ORACLE中的参照完整性定义参照完整性
FOREIGN KEY子句:定义外码列
REFERENCES子句:外码相应于哪个表的主码
ON DELETE CASCADE子语:
在删除被参照关系的元组时,同时删除参照关系中 外码值等于被参照关系的元组中主码值的元组ORACLE中的参照完整性(续)ORACLE中的参照完整性(续)例1:建立表EMP表
CREATE TABLE EMP
(Empno NUMBER(4),
Ename VARCHAR(10),
Job VERCHAR2(9),
Mgr NUMBER(4),
Sal NUMBER(7,2),
Deptno NUMBER(2),
CONSTRAINT FK_DEPTNO
FOREIGN KEY (Deptno)
REFERENCES DEPT(Deptno));ORACLE中的参照完整性(续)ORACLE中的参照完整性(续)或:
CREATE TABLE EMP
(Empno NUMBER(4),
Ename VARCHAR(10),
Job VERCHAR2(9),
Mgr NUMBER(4),
Sal NUMBER(7,2),
Deptno NUMBER(2) CONSTRAINT FK_DEPTNO
FOREIGN KEY REFERENCES DEPT(Deptno));ORACLE中的参照完整性(续)ORACLE中的参照完整性(续)这时EMP表中外码为Deptno,它相应于DEPT表中的主码Deptno。
当要修改DEPT表中的DEPTNO值时,先要检查EMP表中有无元组的Deptno值与之对应
若没有,系统接受这个修改操作
否则,系统拒绝此操作 ORACLE中的参照完整性(续)ORACLE中的参照完整性(续)当要删除DEPT表中某个元组时,系统要检查EMP表,若找到相应元组即将其随之删除。
当要插入EMP表中某个元组时,系统要检查DEPT表,先要检查DEPT表中有无元组的Deptno值与之对应
若没有,系统拒绝此插入操作
否则,系统接受此操作三、ORACLE中用户定义的完整性三、ORACLE中用户定义的完整性ORACLE中定义用户完整性的两类方法
用CREATE TABLE语句在建表时定义用户完整性约束
通过触发器来定义用户的完整性规则ORACLE中用户定义的完整性(续)ORACLE中用户定义的完整性(续)1. 用CREATE TABLE语句在建表时定义用户完整性约束
可定义三类完整性约束
列值非空(NOT NULL短语)
列值唯一(UNIQUE短语)
检查列值是否满足一个布尔表达式(CHECK短语)ORACLE中用户定义的完整性(续)ORACLE中用户定义的完整性(续)例1:建立部门表DEPT,要求部门名称Dname列
取值唯一,部门编号Deptno列为主码
CREATE TABLE DEPT
(Deptno NUMBER,
Dname VARCHAR(9) CONSTRAINT U1 UNIQUE,
Loc VARCHAR(10),
CONSTRAINT PK_DEPT PRIMARY KEY (Deptno));
其中 CONSTRAINT U1 UNIQUE 表示约束名为U1,
该约束要求Dname列值唯一。ORACLE中用户定义的完整性(续)ORACLE中用户定义的完整性(续)例2: 建立学生登记表Student,要求学号在
900000至999999之间,年龄<29,性别
只能是‘男’或‘女’,姓名非空
CREATE TABLE Student
(Sno NUMBER(5)
CONSTRAINT C1 CHECK
(Sno BETWEEN 10000 AND 99999),
Sname VARCHAR(20) CONSTRAINT C2 NOT NULL,
Sage NUMBER(3) CONSTRAINT C3 CHECK (Sage < 29),
Ssex VARCHAR(2)
CONSTRAINT C4 CHECK (Ssex IN ('男', '女'));ORACLE中用户定义的完整性(续)ORACLE中用户定义的完整性(续)例3 :建立职工表EMP,要求每个职工的应发工资不得超过3000元。 应发工资实际上就是实发工资列Sal与扣除项Deduct之和。
CREATE TABLE EMP
(Eno NUMBER(4)
Ename VARCHAR(10),
Job VARCHAR(8),
Sal NUMBER(7,2),
Deduct NUMBER(7,2)
Deptno NUMBER(2),
CONSTRAINTS C1 CHECK (Sal + Deduct <=3000));ORACLE中用户定义的完整性(续)ORACLE中用户定义的完整性(续)2. 通过触发器来定义用户的完整性规则
定义其它的完整性约束时,需要用数据库触发器(Trigger)来实现。
数据库触发器:一类靠事务驱动的特殊过程
一旦由某个用户定义,任何用户对该数据的增、删、改操作均由服务器自动激活相应的触发子,在核心层进行集中的完整性控制
定义数据库触发器的语句
CREATE [OR REPLACE] TRIGGERORACLE中用户定义的完整性(续)ORACLE中用户定义的完整性(续)例4: 为教师表Teacher定义完整性规则
“教授的工资不得低于800元,如果低于800元,自动改为800元”
ORACLE中用户定义的完整性(续)ORACLE中用户定义的完整性(续)CREATE TRIGGER UPDATE_SAL
BEFORE INSERT OR UPDATE OF Sal, Pos ON Teacher
FOR EACH ROW
WHEN (:new.Pos='教授')
BEGIN
IF :new.sal<800
THEN
:new.Sal:=800;
END IF;
END;Oracle完整性小结Oracle完整性小结ORACLE提供定义完整性约束条件
CREATE TABLE语句
CREATE TRIGGER语句
可以定义很复杂的完整性约束条件
ORACLE自动执行相应的完整性检查
对于违反完整性约束条件的操作:
拒绝执行或者执行事先定义的操作5.8 小结5.8 小结数据库的完整性是为了保证数据库中存储的数据是正确的
RDBMS完整性实现的机制
完整性约束定义机制
完整性检查机制
违背完整性约束条件时RDBMS应采取的动作