四川九寨沟

89
An Introduction to Database Syst em 四四四四四

description

四川九寨沟. 中国人民大学信息学院 王珊. 数据库系统概论 An Introduction to Database System 第五章 数据库完整性. 数据库完整性. 什么是数据库的安全性? 什么是数据库的完整性? 两者的区别和联系? DBMS 安全性子系统组成? DBMS 完整性子系统组成?. 数据库完整性. 数据库的完整性 指数据的 正确性和相容性 正确性(有效性):数据的合法性,是否在定义的有效范围 相容性(一致性) :同一事实的 2 个数据相同 例如 : 学生的学号必须唯一 性别只能是男或女 本科学生年龄的取值范围为 14~50 的整数 - PowerPoint PPT Presentation

Transcript of 四川九寨沟

Page 1: 四川九寨沟

An Introduction to Database System

四川九寨沟

Page 2: 四川九寨沟

An Introduction to Database System

中国人民大学信息学院

王珊

数据库系统概论An Introduction to Database System

第五章 数据库完整性

Page 3: 四川九寨沟

An Introduction to Database System

数据库完整性

什么是数据库的安全性?

什么是数据库的完整性?

两者的区别和联系?

DBMS 安全性子系统组成?

DBMS 完整性子系统组成?

Page 4: 四川九寨沟

An Introduction to Database System

数据库完整性

数据库的完整性 指数据的正确性和相容性

正确性(有效性):数据的合法性,是否在定义的有效范围

相容性(一致性) :同一事实的 2 个数据相同

例如 :

学生的学号必须唯一

性别只能是男或女

本科学生年龄的取值范围为 14~50 的整数

学生所选的课程必须是学校开设的课程等

Page 5: 四川九寨沟

An Introduction to Database System

数据的完整性和安全性是两个不同概念

数据的完整性是为了防止数据库中存在不符合语义的数据,也就是

防止数据库中存在不正确的数据完整性检查和控制的防范对象 : 不合语义的、不正确

的数据 数据的安全性

是保护数据库防止恶意的破坏和非法的存取安全性控制的防范对象 : 非法用户和非法操作,防止

他们对数据库数据的非法存取

Page 6: 四川九寨沟

An Introduction to Database System

数据库完整性 ( 续 )

为维护数据库的完整性, DBMS 必须:

1. 提供定义完整性约束条件的机制完整性约束条件也称为完整性规则,是数据库中的数

据必须满足的语义约束条件

SQL 标准使用了一系列概念来描述完整性,包括关系

模型的实体完整性、参照完整性和用户定义完整性

这些完整性一般由 SQL 的 DDL 语句来实现

Page 7: 四川九寨沟

An Introduction to Database System

数据库完整性 ( 续 )

2. 提供完整性检查的方法一般在 INSERT 、 UPDATE 、 DELETE 语句执行

后开始检查,也可以在事务提交时检查

3. 违约处理 DBMS 若发现用户的操作违背了完整性约束条件,

就采取一定的动作

• 拒绝 (NO ACTION) 执行该操作• 级连 (CASCADE) 执行其他操作

Page 8: 四川九寨沟

An Introduction to Database System

第五章 数据库完整性

5.1 实体完整性5.2 参照完整性5.3 用户定义的完整性5.4 完整性约束命名字句5.5 域中的完整性限制5.6 触发器5.7 小结

Page 9: 四川九寨沟

An Introduction to Database System

5.1 实体完整性

5.1.1 实体完整性定义

5.1.2 实体完整性检查和违约处理

Page 10: 四川九寨沟

An Introduction to Database System

5.1.1 实体完整性定义

关系模型的实体完整性 CREATE TABLE 中用 PRIMARY KEY 定义

单属性构成的码有两种说明方法 定义为列级约束条件 定义为表级约束条件

对多个属性构成的码只有一种说明方法 定义为表级约束条件

Page 11: 四川九寨沟

An Introduction to Database System

实体完整性定义 ( 续 )[例 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 ) ); /* 在表级定义主码 */

Page 12: 四川九寨沟

An Introduction to Database System

实体完整性定义 ( 续 )

[例 2 ]将 SC 表中的 Sno , Cno 属性组定义为码

CREATE TABLE SC

(Sno CHAR(9) NOT NULL ,

Cno CHAR(4) NOT NULL ,

Grade SMALLINT ,

PRIMARY KEY (Sno , Cno) /* 只能在表级定义主码 */

);

Page 13: 四川九寨沟

An Introduction to Database System

5.1.2 实体完整性检查和违约处理

当用户程序对基本表插入一条记录或者对主码列进行更新操作时,

RDBMS 自动进行检查。包括:

1. 检查主码值是否唯一,如果不唯一则拒绝插入或修改

2. 检查主码的各个属性是否为空,只要有一个为空就拒绝插入或修改

检查记录中主码值是否唯一的一种方法是进行全表扫描

依次判断表中每一条记录的主码值与将插入记录上的主码值(或者修改的新主码

值)是否相同

Page 14: 四川九寨沟

An Introduction to Database System

实体完整性检查和违约处理 ( 续 )

用全表扫描方法检查主码唯一性

全表扫描缺点:十分耗时为避免对基本表进行全表扫描, RDBMS 核心一般都在主码上自动建立一个索引

Page 15: 四川九寨沟

An Introduction to Database System

实体完整性检查和违约处理 ( 续 )

通过 B+ 树索引查找基本表中是否已经存在新的主码值,可以提高效率

如果新插入记录的主码值是 25

通过主码索引,从 B+ 树的根结点开始查找

读取 3 个结点:根结点( 51 )中间结点( 12 30 )叶结点( 15 20 25 )

该主码值已经存在,不能插入这条记录

使用索引检查主码唯一

Page 16: 四川九寨沟

An Introduction to Database System

第五章 数据库完整性

5.1 实体完整性5.2 参照完整性5.3 用户定义的完整性5.4 完整性约束命名字句5.5 域中的完整性限制5.6 触发器5.7 小结

Page 17: 四川九寨沟

An Introduction to Database System

5.2 参照完整性

5.2.1 参照完整性定义

在 CREATE TABLE 中用 FOREIGN KEY 短语定义

哪些列为外码

用 REFERENCES 短语指明这些外码参照哪些表的

主码

5.2.2 参照完整性检查和违约处理

Page 18: 四川九寨沟

An Introduction to Database System

参照完整性定义 ( 续 )

[例 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)

/* 在表级定义参照完整性 */

);

Page 19: 四川九寨沟

An Introduction to Database System

5.2 参照完整性

5.2.1 参照完整性定义

5.2.2 参照完整性检查和违约处理

一个参照完整性将两个表中的相应元组联系起来

对被参照表和参照表进行增删改操作时有可能破坏

参照完整性,必须进行检查

Page 20: 四川九寨沟

An Introduction to Database System

参照完整性检查 ( 续 )

例如,对表 SC 和 Student 有四种可能破坏参照完整性的情况

1. SC 表中增加一个元组,该元组的 Sno 属性的值在表 Student 中找不到一

个元组,其 Sno 属性的值与之相等。

2. 修改 SC 表中的一个元组,修改后该元组的 Sno 属性的值在表 Student

中找不到一个元组,其 Sno 属性的值与之相等。

3. 从 Student 表中删除一个元组,造成 SC 表中某些元组的 Sno 属性的值

在表 Student 中找不到一个元组,其 Sno 属性的值与之相等。

4. 修改 Student 表中一个元组的 Sno 属性,造成 SC 表中某些元组的 Sno

属性的值在表 Student 中找不到一个元组,其 Sno 属性的值与之相等

Page 21: 四川九寨沟

An Introduction to Database System

参照完整性检查和违约处理 ( 续 )

可能破坏参照完整性的情况及违约处理

被参照表(例如 Student)

参照表(例如 SC ) 违约处理

可能破坏参照完整性 插入元组 拒绝

可能破坏参照完整性 修改外码值 拒绝

删除元组 可能破坏参照完整性 拒绝 / 级连删除 / 设置为空值

修改主码值 可能破坏参照完整性 拒绝 / 级连修改 / 设置为空值

Page 22: 四川九寨沟

An Introduction to Database System

违约处理参照完整性违约处理

1. 拒绝 (NO ACTION) 执行不允许该操作执行。一般设置为默认策略。

2. 级连 (CASCADE) 操作当删除或修改被参照表 (Student) 的一个元组造成了与参照表 (SC)

的不一致,则删除或修改参照表中的所有造成不一致的元组例如,删除 Student 表中的元组, Sno 值为 200215121 ,则从要SC 表中级连删除 SC.Sno='200215121' 的所有元组

3. 设置为空值( SET-NULL )当删除或修改被参照表的一个元组时造成了不一致,则将参照表中的所有造成不一致的元组的对应属性设置为空值。

Page 23: 四川九寨沟

An Introduction to Database System

违约处理 ( 续 )

3. 设置为空值( SET-NULL )(续)例如,有下面 2 个关系 学生(学号,姓名,性别,专业号,年龄) 专业(专业号,专业名) 假设专业表中某个元组被删除,专业号为 12

按照设置为空值的策略,就要把学生表中专业号 =12 的所有元组的专业号设置为空值。

对应语义:某个专业删除了,该专业的所有学生专业未定,等待重新分配专业

外码

Page 24: 四川九寨沟

An Introduction to Database System

违约处理 ( 续 )

对于参照完整性,除了应该定义外码,还应定义外码列是否允许空值

在学生表中,“专业号”是外码,可以取空值,表示这个学生的专业尚未确定 学生-选课数据库中

Student 关系为被参照关系,其主码为 Sno

SC 为参照关系, Sno 为外码 同时 Sno 为 SC 的主属性,按照实体完整性 Sno 不能为空值 若 SC 的 Sno 为空值,则表明尚不存在的某个学生,或者某个不知学号的学生,选修了某门课程,其成绩记录

在 Grade 列中 , 这与学校的应用环境是不相符的

因此 SC 的 Sno 列不能取空值。同样, SC 的 Cno 列不能取空值

一般地,当对参照表和被参照表的操作违反了参照完整性,系统选用默认策略,即拒绝执行。

如果想让系统采用其他的策略则必须在创建表的时候显式地加以说明

Page 25: 四川九寨沟

An Introduction to Database System

违约处理 ( 续 )

[例 4 ] 显式说明参照完整性的违约处理示例 CREATE TABLE SC (Sno CHAR(9) , Cno CHAR(4) , 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 表中相应的元组 */ );

Page 26: 四川九寨沟

An Introduction to Database System

第五章 数据库完整性

5.1 实体完整性5.2 参照完整性5.3 用户定义的完整性5.4 完整性约束命名字句5.5 域中的完整性限制5.6 触发器5.7 小结

Page 27: 四川九寨沟

An Introduction to Database System

5.3 用户定义的完整性

用户定义的完整性就是针对某一具体应用的数据必须

满足的语义要求

RDBMS 都提供了定义和检验这类完整性的机制,使

用了和实体完整性、参照完整性相同的技术和方法来

处理它们,而不必由应用程序承担这一功能

Page 28: 四川九寨沟

An Introduction to Database System

5.3 用户定义的完整性

5.3.1 属性上的约束条件的定义

5.3.2 属性上的约束条件检查和违约处理

5.3.3 元组上的约束条件的定义

5.3.4 元组上的约束条件检查和违约处理

Page 29: 四川九寨沟

An Introduction to Database System

5.3.1 属性上的约束条件的定义

在 CREATE TABLE 定义属性的同时可以根据应用要求,定义属性上的约束条件,即属性值限制,包括: 列值非空( NOT NULL 短语)

列值唯一( UNIQUE 短语)

检查列值是否满足某个条件( CHECK 短语)

Page 30: 四川九寨沟

An Introduction to Database System

属性上的约束条件的定义 ( 续 )

1. 不允许取空值 [例 5 ] 在定义 SC 表时,说明 Sno 、 Cno 、 Grade 属性不允许取空值。 CREATE TABLE SC

( Sno CHAR(9) , Cno CHAR(4) , Grade SMALLINT NOT NULL ,

PRIMARY KEY (Sno , Cno) , /* 如果在表级定义实体完整性,隐含了 Sno , Cno*/

/* 不允许取空值,则在列级不允许取空值的定义就不必写了 */

FOREIGN KEY (Sno) REFERENCES Student(Sno) , /* 在表级定义参照完整性 */

FOREIGN KEY (Cno) REFERENCES Course(Cno)

/* 在表级定义参照完整性 */

);

Page 31: 四川九寨沟

An Introduction to Database System

属性上的约束条件的定义 ( 续 )

2. 列值唯一 [例 6 ]建立部门表 DEPT ,要求部门名称 Dname 列取值唯 一,部门编号 Deptno 列为主码

CREATE TABLE DEPT

( Deptno NUMERIC(2) , Dname CHAR(9) UNIQUE , /* 要求 Dname 列值唯一 */

Location CHAR(10) , PRIMARY KEY (Deptno)

);

Page 32: 四川九寨沟

An Introduction to Database System

属性上的约束条件的定义 ( 续 )

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)

);

Page 33: 四川九寨沟

An Introduction to Database System

属性上的约束条件的定义 ( 续 )

3. 用 CHECK 短语指定列值应该满足的条件 [例 8 ] SC 表的 Grade 的值应该在 0 和 100 之间 CREATE TABLE SC

(Sno CHAR(9) , Cno CHAR(4) , Grade SMALLINT CHECK (Grade>=0 AND Grade <=100) , PRIMARY KEY (Sno , Cno) , FOREIGN KEY (Sno) REFERENCES Student(Sno) , FOREIGN KEY (Cno) REFERENCES Course(Cno)

);

Page 34: 四川九寨沟

An Introduction to Database System

5.3 用户定义的完整性

5.3.1 属性上的约束条件的定义

5.3.2 属性上的约束条件检查和违约处理

5.3.3 元组上的约束条件的定义

5.3.4 元组上的约束条件检查和违约处理

Page 35: 四川九寨沟

An Introduction to Database System

5.3.2 属性上的约束条件检查和违约处理

当往表中插入元组或修改属性的值时, RDBMS

就检查属性上的约束条件是否被满足

如果不满足则操作被拒绝执行

Page 36: 四川九寨沟

An Introduction to Database System

5.3 用户定义的完整性

5.3.1 属性上的约束条件的定义

5.3.2 属性上的约束条件检查和违约处理

5.3.3 元组上的约束条件的定义

5.3.4 元组上的约束条件检查和违约处理

Page 37: 四川九寨沟

An Introduction to Database System

5.3.3 元组上的约束条件的定义

在 CREATE TABLE 语句中可以用 CHECK 短语定义元

组上的约束条件,即元组级的限制

同属性值限制相比,元组级的限制可以设置不同属性之

间的取值的相互约束条件

Page 38: 四川九寨沟

An Introduction to Database System

元组上的约束条件的定义 ( 续 )[例 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.打头

Page 39: 四川九寨沟

An Introduction to Database System

5.3 用户定义的完整性

5.3.1 属性上的约束条件的定义

5.3.2 属性上的约束条件检查和违约处理

5.3.3 元组上的约束条件的定义

5.3.4 元组上的约束条件检查和违约处理

Page 40: 四川九寨沟

An Introduction to Database System

5.3.4 元组上的约束条件检查和违约处理

当往表中插入元组或修改属性的值时, RDBMS 就检

查元组上的约束条件是否被满足

如果不满足则操作被拒绝执行

Page 41: 四川九寨沟

An Introduction to Database System

第五章 数据库完整性

5.1 实体完整性5.2 参照完整性5.3 用户定义的完整性5.4 完整性约束命名字句*5.5 域中的完整性限制5.6 触发器5.7 小结

Page 42: 四川九寨沟

An Introduction to Database System

5.4 完整性约束命名字句

SQL还在 CREATE TABLE 语句中提供了完整性约束命名

子句 CONSTRAINT ,用来对完整性约束条件命名

1. 完整性约束命名子句

CONSTRAINT < 完整性约束条件名 >

[ PRIMARY KEY 短语 |FOREIGN KEY 短语 |CHECK 短语]

Page 43: 四川九寨沟

An Introduction to Database System

完整性约束命名字句 ( 续 )

[例 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 四个列级约束。

Page 44: 四川九寨沟

An Introduction to Database System

完整性约束命名字句 ( 续 )

[例 11 ]建立教师表 TEACHER ,要求每个教师的应发工资不低于 3000元

应发工资实际上就是实发工资列 Sal 与扣除项 Deduct 之和。 CREATE TABLE TEACHER ( Eno NUMERIC(4) PRIMARY KEY , Ename CHAR(10) , Job CHAR(8) , Sal NUMERIC(7 , 2) , Deduct NUMERIC(7 , 2) , Deptno NUMERIC(2) , CONSTRAINT EMPFKey FOREIGN KEY (Deptno) REFERENCES DEPT(Deptno) , CONSTRAINT C1 CHECK (Sal + Deduct >= 3000) );

Page 45: 四川九寨沟

An Introduction to Database System

完整性约束命名字句 ( 续 )

2. 修改表中的完整性限制

使用 ALTER TABLE 语句修改表中的完整性限制

ALTER TABLE < 表名 >[ ADD < 新列名 > < 数据类型 > [ 完整性约束 ] ][ DROP < 完整性约束名 > ][ ALTER COLUMN< 列名 > < 数据类型 > ];

[例 12 ]去掉[例 10 ] Student 表中对性别的限制 ALTER TABLE Student DROP CONSTRAINT C4;

Page 46: 四川九寨沟

An Introduction to Database System

完整性约束命名字句 ( 续 )

[例 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);

Page 47: 四川九寨沟

An Introduction to Database System

第五章 数据库完整性

5.1 实体完整性5.2 参照完整性5.3 用户定义的完整性5.4 完整性约束命名字句5.5 域中的完整性限制5.6 触发器5.7 小结

Page 48: 四川九寨沟

An Introduction to Database System

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 (' 男 ' , ' 女 ') );

Page 49: 四川九寨沟

An Introduction to Database System

域中的完整性限制 ( 续 )

[例 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')

Page 50: 四川九寨沟

An Introduction to Database System

第五章 数据库完整性(补充)

断言 Assertion

可以定义 涉及多个表的或聚集操作的完整性约束 CREATE ASSERTION < 断言名 > CHECK < 条件 >

条件 : 与 WHERE 子句的 < 条件表达式 > 相同

DROP ASSERTION < 断言名 >

Page 51: 四川九寨沟

An Introduction to Database System

第五章 数据库完整性(补充)

[ 例 1]限制 数据库课程最多 60名学生选修

CREATE ASSERTION ASSE_SC_DB_NUM

CHECK ( 60> = ( select count(*)

from C,SC

where sc.cno=c.cno and c.cname = ‘ 数据库’ ) ) ;

Page 52: 四川九寨沟

An Introduction to Database System

第五章 数据库完整性(补充)[ 例 2] 限制 每一门课程最多 60名学生选修 请大家完成

CREATE ASSERTION ASSE_SC_CNUM1

CHECK ( 60> = ( select count (*) from SC group by cno ) ) ;

[ 例 3] 限制 每个学期每一门课程最多 60名学生选修,应该如何

修改数据库模式,请修改,并完成该习题ALTER TABLE SC ADD TERM DATE;

CREATE ASSERTION ASSE_SC_CNUM2

CHECK ( 60> = ( select count (*) from SC

group by cno , TERM ) ) ;

Page 53: 四川九寨沟

An Introduction to Database System

第五章 数据库完整性

5.1 实体完整性5.2 参照完整性5.3 用户定义的完整性5.4 完整性约束命名字句5.5 域中的完整性限制5.6 触发器5.7 小结

Page 54: 四川九寨沟

An Introduction to Database System

主动数据库

An active database is a database that includes active rules, mostly in the form of ECA rules.

Active database systems enhance traditional database functionality with powerful rule-processing capabilities, providing a uniform and efficient mechanism for many database system applications.

所谓主动数据库是指具有处理 ECA 规则能力的数据库系统。

Page 55: 四川九寨沟

An Introduction to Database System

主动数据库

DB事件发生 行为ECA 规则

Page 56: 四川九寨沟

An Introduction to Database System

ECA Rule

= Active ruleconsist of three parts:

The event part specifies the signal that triggers the invocation of the rule

The condition part is a logical test that, if satisfied or evaluates to true, causes the action to be carried out

The action part consists of updates or invocations on the local data

Page 57: 四川九寨沟

An Introduction to Database System

transaction T

DELETE …UPDATE ……INSERT INTO rel1 VALUES (…);…SELECT …UPDATE …SELECT...

条件判断与规则执行

DB

triggering event

condition

action

INSERT INTO rel1 ...

Rule R

Page 58: 四川九寨沟

An Introduction to Database System

触发器触发器( Trigger )是用户定义在关系表上的一类由事

件驱动的特殊过程 一旦定义,任何用户对表的增、删、改操作均由服务器

自动激活相应的触发器,在 DBMS 核心层进行集中的完整性控制

触发器可以实施比 FOREIGN KEY 约束、 CHECK 约束更为复杂的检查和操作,具有更精细和更强大的对数据完整性控制能力

SQL3 标准支持触发器

Page 59: 四川九寨沟

An Introduction to Database System

5.6 触发器

5.6.1 定义触发器

5.6.2 激活触发器

5.6.3 删除触发器

Page 60: 四川九寨沟

An Introduction to Database System

5.6.1 定义触发器

SQL 使用 CREATE TRIGGER命令建立触发器CREATE TRIGGER <触发器名 >

{ BEFORE | AFTER } <触发事件 > ON < 表名 >

FOR EACH { ROW | STATEMENT }

[ WHEN <触发条件 > ]

<触发动作体 >

Page 61: 四川九寨沟

An Introduction to Database System

定义触发器 ( 续 )

[例 18 ]为教师表 Teacher 定义一个 BEFORE 行级触发器: “教授的工资不得低于 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;

Page 62: 四川九寨沟

An Introduction to Database System

定义触发器 ( 续 )

定义触发器的语法说明 :

1. 表的拥有者即创建表的用户才可以在表上创建触发器,并且一个表上只能创建一定数量的触发器

2. 触发器名触发器名可以包含模式名,也可以不包含模式名同一模式下,触发器名必须是唯一的触发器名和 < 表名 > 必须在同一模式下

3. 表名当这个表的数据发生变化时,将激活定义在该表上相应<触发事件 > 的触发器,该表称为触发器的目标表

Page 63: 四川九寨沟

An Introduction to Database System

定义触发器 ( 续 )

4. 触发事件 触发事件可以是 INSERT 、 DELETE 或 UPDATE 及其组合 UPDATE 后面还可以有 OF<触发列, ...> ,即进一步指明修改哪些列时触发器激活

触发器动作时间: BEFORE :触发事件进行前,测试 <触发条件 >

AFTER : 触发事件发生后,测试 <触发条件 >

5.触发器的类型:触发器按照所触发动作的间隔可以分为: 行级触发器( FOR EACH ROW ) 语句级触发器( FOR EACH STATEMENT )

Page 64: 四川九寨沟

An Introduction to Database System

定义触发器 ( 续 )

6. 触发条件 触发器被激活时,只有当触发条件为真时触发动作体才执行;

否则触发动作体不执行。

如果省略WHEN触发条件,则触发动作体在触发器激活后立即执行

7. 触发动作体 可以是一个 PL/SQL 过程块 也可以是对已创建存储过程的调用 如果触发动作体执行失败,激活触发器的事件就会终止执行,触发器的目标

表或触发器可能影响的其他对象不发生任何变化

Page 65: 四川九寨沟

An Introduction to Database System

定义触发器 ( 续 )[例 18 ]为教师表 Teacher 定义一个 BEFORE 行级触发器:

“教授的工资不得低于 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;

7. 对触发动作体的进一步讲解 如果是行级触发器,用户可以在过程体中使用 NEW 和 OLD /* KingbaseES 的语法 */

引用 UPDATE/INSERT 事件之后的新值和 UPDATE/DELETE 事件之前的旧值 如果是语句级触发器,则不能在触发动作体中使用 NEW 或 OLD 进行引用

Page 66: 四川九寨沟

An Introduction to Database System

定义触发器 ( 续 )

[例 18 ]CREATE TRIGGER Insert_Or_Update_Sal BEFORE INSERT OR UPDATE ON Teacher /*触发事件是插入或更新操作 */REFERENCING

NEW AS NewTuple /* NEW AS 字句 定义修改后的元组变量 */

FOR EACH ROW /* 行级触发器 */

AS BEGIN /* 定义触发动作体,是 PL/SQL 过程块 */

IF (NewTuple.Job='教授 ') AND (NewTuple.Sal < 4000) THEN NewTuple.Sal :=4000 ; END IF; END; /* SQL3 的语法 */

Page 67: 四川九寨沟

An Introduction to Database System

定义触发器 ( 续 )

当对表 SC 的 Grade 属性进行修改时,若分数增加了 10% 则将此次操作记录

到另一个表 SC_U 中,假设 SC_U 表有四个属性 Sno 、 Cno 、 Oldgrade 、Newgrade ,其中 Oldgrade 是修改前的分数, Newgrade 是修改后的分

数。

CREATE TRIGGER SC_Tri

AFTER UPDATE OF Grade ON SC

WHEN (New.Grade >= 1.1 * Old.Grade)

FOR EACH ROW

INSERT INTO SC_U (Sno, Cno, OldGrade, NewGrade)

VALUES(Old.Sno ,Old.Cno, Old.Grade, New.Grade)

Page 68: 四川九寨沟

An Introduction to Database System

定义触发器 ( 续 )

[例 19 ]当教师表 Teacher 的工资发生变化后就自动在工资变化表 Sal_log 中增加一条相应记录

CREATE TABLE Sal_log /* 首先建立工资变化表 Sal_log*/ (Eno NUMERIC(4) referenceteacher(Eno) , Sal NUMERIC(7 , 2) , Username char(10) , Date TIMESTAMP );

CREATE TRIGGER Insert_Sal /* 建立一个 AFTER 行级触发器 */ AFTER INSERT ON Teacher /*触发事件是 INSERT*/ FOR EACH ROW AS BEGIN INSERT INTO Sal_log VALUES ( New.Eno , New.Sal , CURRENT_USER , CURRENT_TIMESTAM

P); END;

Page 69: 四川九寨沟

An Introduction to Database System

定义触发器 ( 续 )

CREATE TRIGGER Update_Sal /* 建立一个 AFTER 行级触发器 */

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;

Page 70: 四川九寨沟

An Introduction to Database System

定义触发器 ( 续 )

触发器与 前面介绍的各种完整性限制的不同完整性限制是当被限制的对象发生变化时,系统就去检查该对象变

化后能否满足限制条件,如果不能满足,就拒绝引起这种变化的操

作。

触发器是当特定的系统事件(对一个表的增、删、改,事务的结

束)发生时,对规则的条件进行检查,如果条件成立则执行规则中

的动作,否则不执行该动作。

触发事件的操作可能执行也可能不执行。

Page 71: 四川九寨沟

An Introduction to Database System

5.6 触发器

5.6.1 定义触发器

5.6.2 激活触发器

5.6.3 删除触发器

Page 72: 四川九寨沟

An Introduction to Database System

5.6.2 激活触发器 触发器的执行,是由触发事件激活的,并由数据库服务器自动执行 同一个表上的多个触发器激活时遵循如下的执行顺序:

( 1 ) 执行该表上的 BEFORE触发器;

( 2 ) 激活触发器的 SQL 语句;

( 3 ) 执行该表上的 AFTER触发器。 对于同一个表上的多个 BEFORE(AFTER)触发器

有些 RDBMS遵循“谁先创建谁先执行”的原则,即按照触发器创建的时间先后顺序执行

有些 RDBMS按照触发器名称的字母排序顺序执行触发器

Page 73: 四川九寨沟

An Introduction to Database System

5.6 触发器

5.6.1 定义触发器

5.6.2 激活触发器

5.6.3 删除触发器

Page 74: 四川九寨沟

An Introduction to Database System

5.6.3 删除触发器

删除触发器的 SQL 语法:

DROP TRIGGER <触发器名 > ON < 表名 >;

触发器必须是一个已经创建的触发器,并且只能由具有相

应权限的用户删除。

[例 21 ]删除教师表 Teacher 上的触发器 Insert_Sal

DROP TRIGGER Insert_Sal ON Teacher;

Page 75: 四川九寨沟

An Introduction to Database System

主动数据库的应用

integrity constraints, views, authorization, statistics gathering, monitoring and alerting, knowledge-based systems, expert systems, workflow management,其他

Page 76: 四川九寨沟

An Introduction to Database System

第五章 数据库完整性

5.1 实体完整性5.2 参照完整性5.3 用户定义的完整性5.4 完整性约束命名字句5.5 域中的完整性限制5.6 触发器5.7 小结

Page 77: 四川九寨沟

An Introduction to Database System

5.7 小结 数据库的完整性是为了保证数据库中存储的数据是正确的 RDBMS 完整性实现的机制

完整性约束定义机制 完整性检查机制 违背完整性约束条件时 RDBMS 应采取的动作

在关系系统中,最重要的完整性约束是 实体完整性 参照完整性 用户定义的完整性

Page 78: 四川九寨沟

An Introduction to Database System

小结 ( 续 )

数据库完整性的定义 一般由 SQL 的 DDL 语句实现

作为数据库模式的一部分存入数据字典

在数据库数据修改时 ,RDBMS 的完整性检查机制就按照数据字典

中定义的这些约束进行检查

完整性机制的实施会影响系统性能。随着硬件性能的提高,数据库技

术的发展,目前的 RDBMS 都提供了定义和检查实体完整性、参照完

整性和用户定义的完整性的功能。

Page 79: 四川九寨沟

An Introduction to Database System

小结 ( 续 ) 对于违反完整性的操作

要根据应用语义来选择合适的处理策略,以保证数据库的正确性

实现数据库完整性的一个重要方法是触发器 是定义在关系表上的由事件驱动的特殊过程 可以用于数据库完整性检查 也可以用来实现数据库系统的其他功能

数据库安全性应用系统的一些业务流程和控制流程基于规则的数据和业务控制功能

不同的 RDBMS 实现触发器的语法不同

Page 80: 四川九寨沟

An Introduction to Database System

作业

可能破坏参照完整性的情况及违约处理

被参照表(例如 Student)

参照表(例如 SC ) 违约处理

可能破坏参照完整性 插入元组 拒绝

可能破坏参照完整性 修改外码值 拒绝

删除元组 可能破坏参照完整性 拒绝 / 级连删除 / 设置为空值

修改主码值 可能破坏参照完整性 拒绝 / 级连修改 / 设置为空值

Page 81: 四川九寨沟

An Introduction to Database System

作业

1. 使用触发器来实现参照完整性

a) 向 SC 表中插入元组时,进行参照完整性检查

b) 在 Student 表中,删除一个元组时,进行参照完整性检查

2. 建立一个 SC 表上的触发器

当学生选课变化时 要修改 SC 表中的课程号或增加一个选课记录,

要求保持每门课程选修的人数不超过 60人。如果超过,拒绝学生

选修该门课程。

3. 建立一个 SC 表上的触发器

学期结束 当教师修改 SC 表中修课成绩 Grade 后,找出不及格课程

数大于等于 6门的学生号码和该学生不及格的课程数。

Page 82: 四川九寨沟

An Introduction to Database System

作业定义表 TAB ,并在其上定义触发器 TRI ,在对 TAB 的插入和更新前检查,如果插入或更新的值在 100- 1000 之间的话,将值置为 50;如果值大于 1000 的话,则给出新值不允许大于 1000 的提示。

CREATE TABLE tab (col int) ;

INSERT INTO tab VALUES(10);

INSERT INTO tab VALUES(20);

CREATE TRIGGER tri BEFORE UPDATE OR INSERT ON tab

FOR EACH ROW

AS BEGIN

IF new.col > 100 AND new.col < 1000 THEN new.col := 50; END IF;

IF new.col > 1000 THEN RAISE EXCEPTION ‘New values can not more

than 1000’; END IF;

END;

Page 83: 四川九寨沟

An Introduction to Database System

定义触发器 检测:1. 向表 TAB 插入数据( 150 ): INSERT INTO TAB VALUES(150);

Select * from tab;

Col

-----

10

20

50 /*因为插入的数据为 150 ,触发器 TRI 将插入的值置为 50*/

2. 对表中的数据进行更新,将 20 更新为 1500:

UPDATE TAB SET COL = 1500 WHERE COL = 20;

结果:系统报出‘ New values can not more than 1000’ 的错误, Select * from tab; 发现表中的数据并没有发生改变。说明在更新数

据前,触发器 TRI 自动执行检查,发现值大于 1000 更新无效。

Page 84: 四川九寨沟

An Introduction to Database System

定义触发器 ( 续 )4. 触发事件

触发事件可以是 INSERT 、 DELETE 或 UPDATE 及其组合 UPDATE 后面还可以有 OF<触发列, ...> ,即进一步指明修改哪些列时触发器激活 触发器动作时间:

BEFORE :触发事件进行前,测试 <触发条件 >

AFTER : 触发事件发生后,测试 <触发条件 >

5.触发器的类型:触发器按照所触发动作的间隔可以分为: 行级触发器( FOR EACH ROW ) 语句级触发器( FOR EACH STATEMENT )

例如在 TEACHER 表上创建了一个 AFTER UPDATE触发器。如果表 TEACHER 有1000 行,执行如下语句: UPDATE TEACHER SET Deptno=5;

如是行级触发器,触发动作将执行 1000 次,检查 1000 次 如是语句级触发器,那么执行完该语句后,触发动作只发生一次

Page 85: 四川九寨沟

An Introduction to Database System

激活触发器 ( 续 )

[例 20 ]执行修改某个教师工资的 SQL 语句 UPDATE Teacher SET Sal=800 WHERE Ename='陈平 ';

激活已经定义的触发器的顺序是: 执行触发器 Insert_Or_Update_Sal /* BEFOR触发器 */

执行 SQL 语句

UPDATE Teacher SET Sal=800 WHERE Ename='陈平 ';

执行触发器 Insert_Sal; /* AFTER触发器 */

执行触发器 Update_Sal; /* AFTER触发器 */

Page 86: 四川九寨沟

An Introduction to Database System

5.7 小结

粒 度

状态 列 级 元 组 级 关 系 级

静 态 列定义·类型·格式· 值域

· 空值

元组值应满足的条件

 

实体完整性约束 参照完整性约束 函数依赖约束 统计约束

动 态 改变列定义或列值

元组新旧值之间

应满足的约束条件 关系新旧状态间应满足的约束条件

Page 87: 四川九寨沟

An Introduction to Database System

Page 88: 四川九寨沟

An Introduction to Database System

蔬菜艺术

Page 89: 四川九寨沟

An Introduction to Database System

教育部数据工程与知识工程重点实验室