《数据库系统概论第五章2014》由会员分享,可在线阅读,更多相关《数据库系统概论第五章2014(52页珍藏版)》请在金锄头文库上搜索。
1、数据库系统概论 An Introduction to Database System第五章 数据库完整性An Introduction to Database System数据库完整性n数据库的完整性n数据的正确性和相容性n数据的完整性和安全性是两个不同概念n数据的完整性防止数据库中存在不符合语义的数据,也就是防止数据库中存在不正 确的数据防范对象:不合语义的、不正确的数据n数据的安全性保护数据库防止恶意的破坏和非法的存取防范对象:非法用户和非法操作数据库完整性(续)为维护数据库的完整性,DBMS必须:n1.提供定义完整性约束条件的机制n2.提供完整性检查的方法n3.违约处理第五章 数据库完整
2、性5.1 实体完整性5.2 参照完整性5.3 用户定义的完整性5.4 完整性约束命名字句*5.5 域中的完整性限制5.6 触发器5.7 小结5.1 实体完整性n5.1.1 实体完整性定义n5.1.2 实体完整性检查和违约处理插入或对主码列进行更新操作时,RDBMS按照实体完整性规则自动进行检查。包括:n1. 检查主码值是否唯一,如果不唯一则拒绝插入或修改n2. 检查主码的各个属性是否为空,只要有一个为空就拒绝插入或修改n检查记录中主码值是否唯一的一种方法是进行全表扫描n n索引索引 第五章 数据库完整性5.1 实体完整性5.2 参照完整性5.3 用户定义的完整性5.4 完整性约束命名字句*5.
3、5 域中的完整性限制5.6 触发器5.7 小结5.2 参照完整性n5.2.1 参照完整性定义n5.2.2 参照完整性检查和违约处理5.2.1 参照完整性定义n关系模型的参照完整性定义n在CREATE TABLE中用FOREIGN KEY短语定义哪些列为外码n用REFERENCES短语指明这些外码参照哪些表的主码 参照完整性定义(续)例如,关系SC中一个元组表示一个学生选修的某门课程的成绩 ,(Sno,Cno)是主码。Sno,Cno分别参照引用Student表 的主码和Course表的主码 例3 定义SC中的参照完整性CREATE TABLE SC(Sno CHAR(9) NOT NULL, C
4、no CHAR(4) NOT NULL, Grade SMALLINT,PRIMARY KEY (Sno, Cno),*在表级定义实体完整性*/FOREIGN KEY (Sno) REFERENCES Student(Sno), /*在表级定义参照完整性*/FOREIGN KEY (Cno) REFERENCES Course(Cno) /*在表级定义参照完整性*/);5.2 参照完整性n5.2.1 参照完整性定义n5.2.2 参照完整性检查和违约处理被参照表(例如 Student)参照表(例如SC)违约处 理可能破坏参照完整性 插入元组拒绝可能破坏参照完整性 修改外码值拒绝删除元组 可能破坏
5、参照完整性拒绝/级连删 除/设置为空 值 修改主码值 可能破坏参照完整性拒绝/级连 修改/设置为空 值参照完整性检查和违约处理可能破坏参照完整性的情况及违约处理被参照表(例如Student )参照表(例如SC)违约处 理可能破坏参照完整性 插入元组拒绝可能破坏参照完整性 修改外码值拒绝删除元组 可能破坏参照完整 性拒绝/级连删 除/设置为 空值修改主码值 可能破坏参照完整 性拒绝/级连 修改/设置为 空值第五章 数据库完整性5.1 实体完整性5.2 参照完整性5.3 用户定义的完整性5.4 完整性约束命名字句*5.5 域中的完整性限制5.6 触发器5.7 小结5.3 用户定义的完整性n用户定义
6、的完整性就是针对某一具体应用的数据必须满足的语义要求 nRDBMS提供,而不必由应用程序承担5.3 用户定义的完整性n5.3.1 属性上的约束条件的定义n5.3.2 属性上的约束条件检查和违约处理 n5.3.3 元组上的约束条件的定义 n5.3.4元组上的约束条件检查和违约处理5.3.1 属性上的约束条件的定义nCREATE TABLE时定义n列值非空(NOT NULL)n列值唯一(UNIQUE)n检查列值是否满足一个布尔表达式(CHECK)属性上的约束条件的定义(续)n1.不允许取空值 例5 在定义SC表时,说明Sno、Cno、Grade属性不允许 取空值。CREATE TABLE SC(S
7、no CHAR(9) NOT NULL,Cno CHAR(4) NOT NULL,Grade SMALLINT NOT NULL,PRIMARY KEY (Sno, Cno), /* 如果在表级定义实体完整性,隐含了Sno,Cno不允 许取空值,则在列级不允许取空值的定义就不必写了 * /); 属性上的约束条件的定义(续)n2.列值唯一 例6 建立部门表DEPT,要求部门名称Dname列取值唯 一,部门编号Deptno列为主码CREATE TABLE DEPT(Deptno NUMERIC(2),Dname CHAR(9) UNIQUE,/*要求Dname列值唯一*/Location CHAR
8、(10),PRIMARY KEY (Deptno);属性上的约束条件的定义(续)n3. 用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 用户定义的完整性n5.3.1 属性上的约束条件的定义n5.3.2 属性上的约束条件检查和违约处理
9、n5.3.3 元组上的约束条件的定义 n5.3.4元组上的约束条件检查和违约处理5.3.2 属性上的约束条件检查和违约 处理n插入元组或修改属性的值时,RDBMS检查属性上的约束条件是否被满足n如果不满足则操作被拒绝执行 5.3 用户定义的完整性n5.3.1 属性上的约束条件的定义n5.3.2 属性上的约束条件检查和违约处理 n5.3.3 元组上的约束条件的定义 n5.3.4元组上的约束条件检查和违约处理5.3.3 元组上的约束条件的定义n在CREATE TABLE时可以用CHECK短语定义元组上的约束条件,即元组级的限制n同属性值限制相比,元组级的限制可以设置不同属性之间的取值的相互约束条件
10、 元组上的约束条件的定义(续)例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 用户定义的完整性n5.3.
11、1 属性上的约束条件的定义n5.3.2 属性上的约束条件检查和违约处理 n5.3.3 元组上的约束条件的定义 n5.3.4 元组上的约束条件检查和违约处理5.3.4 元组上的约束条件检查和违约 处理n插入元组或修改属性的值时,RDBMS检查元组上的约束条件是否被满足n如果不满足则操作被拒绝执行 第五章 数据库完整性5.1 实体完整性5.2 参照完整性5.3 用户定义的完整性5.4 完整性约束命名子句*5.5 域中的完整性限制5.6 触发器5.7 小结5.4 完整性约束命名子句nCONSTRAINT 约束CONSTRAINT PRIMARY KEY短语|FOREIGN KEY短语|CHECK短语
12、例10 建立学生登记表Student,要求学号在9000099999之间, 姓名不能取空值,年龄小于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 BEFORE | AFTER ON FOR EACH ROW | STATEMENTWHEN 定义触发器(续)n定义触发器的语法说明:n1
13、. 创建者:表的拥有者n2. 触发器名n3. 表名:触发器的目标表n4. 触发事件:INSERT、DELETE、UPDATEn5. 触发器类型行级触发器(FOR EACH ROW)语句级触发器(FOR EACH STATEMENT)定义触发器(续)n例如,假设在例11的TEACHER表上创建了一个AFTER UPDATE触发器。如果表TEACHER有1000行,执行如下语句:UPDATE TEACHER SET Deptno=5; n如果该触发器为语句级触发器,那么执行完该语句后,触发动作只发生一次n如果是行级触发器,触发动作将执行1000次 定义触发器(续)n6. 触发条件n触发条件为真n省
14、略WHEN触发条件n7. 触发动作体n触发动作体可以是一个匿名PL/SQL过程块n也可以是对已创建存储过程的调用例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
15、 old.Sal) THEN INSERT INTO Sal_log VALUES(new.Eno,new.Sal,CURRENT_USER,CURRENT_TIMESTAMP);END IF;END;5.6 触发器n5.6.1 定义触发器 n5.6.2 激活触发器 n5.6.3 删除触发器 5.6.2 激活触发器n触发器的执行,是由触发事件激活的,并由数据库服务器自动执行n一个数据表上可能定义了多个触发器n同一个表上的多个触发器激活时遵循如下的执行顺序:n(1) 执行该表上的BEFORE触发器;n(2) 激活触发器的SQL语句;n(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 触发器n5.6.1 定义触发器 n5.6.2 激活触发器 n5.6.3 删除触发器 5.6.3 删