1、普通高等教育十五规划教材 数据库系统概论,第5章 数据库完整性,张中军,2018年10月12日星期五,数据库系统原理,3,第5章 完整性,数据库是一种共享资源,是存放数据的场所。 数据库系统需要保护数据库,防止用户有意或无意地破坏数据。数据的完整性和安全性是一个问题的两个方面,都是为了保护数据库中的数据。 数据完整性旨在保护数据库中的数据,防止合法用户对数据库进行修改时破坏数据的一致性; 数据安全性旨在保护数据库,防止未经授权的访问和恶意破坏和修改。,2018年10月12日星期五,数据库系统原理,4,第5章 完整性,完整性概述 5.1 实体完整性 5.2 参照完整性 5.3 用户定义的完整性
2、5.4 完整性约束命名字句 5.5 触发器,完整性概述,2018年10月12日星期五,数据库系统原理,6,完整性概述,数据库的完整性是指数据库中的数据的正确性、一致性和相容性。 数据库中的数据要成为有意义的信息,必须满足一定的语义约束条件。 关系数据库上约束分为 实体完整性 参照完整性 用户定义的完整性,2018年10月12日星期五,数据库系统原理,7,完整性概述,所有的约束都是语义约束,都是用户根据实际问题的语义指定的 实体完整性和参照完整性约束的含义是特定的,用户只需要说明关系的主码和外码,而不必再说明约束条件 对于其他约束(用户定义的完整性),用户需要具体说明约束条件。,2018年10月
3、12日星期五,数据库系统原理,8,约束分类,根据被约束的数据对象,完整性约束可以分为如下四类: 类型(域)约束:说明给定类型的合法取值。 属性约束:说明属性的合法取值。 关系约束:说明关系的合法取值。 数据库约束:说明数据库的合法取值,通常涉及多个关系 实体完整性是一种关系约束,参照完整性是一种数据库约束,而用户定义的完整性可以是上述四种约束的任何一种。,2018年10月12日星期五,数据库系统原理,9,约束分类(续),约束还可以分静态约束和动态约束 静态约束是关于数据库正确状态的约束; 动态约束是数据库从一种正确状态转移到另一种状态的转移约束 例如,对于婚姻状况,如下动态转移约束是正确的 未
4、婚到已婚、已婚到离异、已婚到丧偶、离异到已婚、丧偶到已婚。 对于最后学位,如下动态转移约束是正确的:学士到硕士、学士到博士、硕士到博士。 说明: 属性约束、表约束和参照完整性约束都可以在创建表时说明,2018年10月12日星期五,数据库系统原理,10,DBMS对完整性的支持,为了维护数据库的完整性,完整性控制必须提供: 说明和定义完整性约束条件的方法 DBMS的DDL允许用户根据实际问题的语义说明和定义各种完整性约束条件。 完整性检查机制 DBMS在数据更新可能破坏完整性时自动进行完整性检查。检查可以在更新操作执行时立即执行,也可以在事务提交时进行。 违约处理 当数据更新违反完整性约束时,DB
5、MS应当采取相应的措施,确保数据的完整性。,2018年10月12日星期五,数据库系统原理,11,DBMS对完整性的支持(续),说明 数据库约束的检查是可延迟的,可以延迟到事务提交时进行 其他约束的检查是立即的,在可能导致违反完整性约束的更新时立即进行 所有数据库更新都不能破坏数据库的完整性 当更新违反参照完整性约束时存在多种可能的补救措施,可以允许更新,并自动采取相应的行动(见5.2节) 在其他情况下(如违反实体完整性和违反用户定义的完整性约束),违反完整性约束的更新通常被拒绝 DBMS也提供一些机制,使得用户可以说明对某些违反完整性约束的更新所采取的行动(见5.5节),5.1实体完整性,20
6、18年10月12日星期五,数据库系统原理,13,实体完整性,在关系数据库中,一个基本关系对应于一个实体集或联系集 实体完整性约束是一个关系内的约束 实体完整性规则 每个关系应该有一个主码,每个元组的主码值唯一确定该元组 主码的任何属性都不能取空值 何时可能破坏实体完整性 删除操作不会破坏实体完整性 插入新元组和修改某个(些)元组的主码可能破坏实体完整性,2018年10月12日星期五,数据库系统原理,14,实体完整性(续),何时检查实体完整性和处理措施 DBMS应当在插入新元组和修改元组的主码时自动检查是否导致违反实体完整性约束 拒绝导致破坏实体完整性约束的任何插入或修改 判断主属性是否为空值是
7、简单的 主码唯一性检查 为了有效地判定主码上的值是否唯一,通常DBMS自动在主码上建立索引(如B+树索引) 通过索引查找而不必访问任何元组就能确定主码上的值是否唯一。,2018年10月12日星期五,数据库系统原理,15,主码说明,SQL对实体完整性的支持 用户只需要在创建基本表时说明关系的主码,系统就能够自动地保证实体完整性 SQL说明主码的方法已在第3章讨论,如下: 关系模型的实体完整性 CREATE TABLE中用PRIMARY KEY定义,2018年10月12日星期五,数据库系统原理,16,主码说明(续),单属性构成的码有两种说明方法 定义为列级约束条件 定义为表级约束条件 对多个属性构
8、成的码只有一种说明方法 定义为表级约束条件,2018年10月12日星期五,数据库系统原理,17,主码说明(续),(1)在列级定义主码CREATE TABLE Student(Sno CHAR(9) PRIMARY KEY,Sname CHAR(20) NOT NULL, Ssex CHAR(2) ,Sage SMALLINT,Sdept CHAR(20);,例1 将Student表中的Sno属性定义为码,2018年10月12日星期五,数据库系统原理,18,主码说明(续),(2)在表级定义主码CREATE TABLE Student(Sno CHAR(9), Sname CHAR(20) NOT
9、 NULL,Ssex CHAR(2) ,Sage SMALLINT,Sdept CHAR(20),PRIMARY KEY (Sno);,2018年10月12日星期五,数据库系统原理,19,主码说明(续),CREATE TABLE SC(Sno CHAR(9) NOT NULL, Cno CHAR(4) NOT NULL, Grade SMALLINT,PRIMARY KEY (Sno,Cno) /*只能在表级定义主码*/);,例2将SC表中的Sno,Cno属性组定义为码,5.2参照完整性,2018年10月12日星期五,数据库系统原理,21,参照完整性,参照完整性约束是不同关系之间或同一关系的不
10、同元组间的约束 参照完整性规则 参照关系R的任何元组在其外码FKR上的值或者等于被参照关系S的某个元组在主码Ks上的值,或者为空值。 即,参照完整性要求要么不参照(外码取空值),要么被参照的对象必须存在,2018年10月12日星期五,数据库系统原理,22,参照完整性定义(续),例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 Stude
11、nt(Sno), /*在表级定义参照完整性*/FOREIGN KEY (Cno) REFERENCES Course(Cno) /*在表级定义参照完整性*/);,例如,关系SC中一个元组表示一个学生选修的某门课程的成绩,(Sno,Cno)是主码。Sno,Cno分别参照引用Student表的主码和Course表的主码,2018年10月12日星期五,数据库系统原理,23,参照完整性(续),说明 DBMS应当支持实体完整性和参照完整性约束 然而,与实体完整性不同,违反参照完整性存在不同的处理方案,DBMS允许用户根据实际情况选择不同的处理方法。 设R 为参照关系,其外码FKR ;S 为被参照关系,其
12、主码为Ks 删除参照关系R 的元组或向被参照关系S 插入新元组都不会违反参照完整性 在其他情况下可能破坏参照完整性,2018年10月12日星期五,数据库系统原理,24,参照完整性(续),2. 违反参照完整性的更新 向参照关系R中插入新元组tR 如果不存在被参照关系S的元组tS使得tRFKR= tSKs,则破坏参照完整性。 从被参照关系S中删除元组tS 如果存在参照关系R的元组tR使得tSKs= tRFKR,则破坏参照完整性(删除导致tR违反参照完整性) 修改参照关系R的元组tR外码上的值 如果不存在被参照关系S的元组tS使得new(tRFKR)=tSKs,则破坏参照完整性。其中new(tRFK
13、R)表示元组tR修改后在外码上的值,2018年10月12日星期五,数据库系统原理,25,参照完整性(续),修改被参照关系S的元组tS主码上的值 如果存在参照关系R的元组,tR 使得old(tSKs)= tRFKR,则破坏参照完整性(修改导致tR违反参照完整性) 其中old(tSKs)表示元组tS修改前在主码上的值。在上述四种情况下,DBMS应当自动进行参照完整性检查,即下表情况,2018年10月12日星期五,数据库系统原理,26,参照完整性(续),2018年10月12日星期五,数据库系统原理,27,参照完整性(续),3. 保证参照完整性的措施 当更新导致破坏参照完整性时,可能的处理措施包括:
14、拒绝、级联、置空值和置缺省值 (1) 拒绝:拒绝违反参照完整性的更新 是最简单的处理措施 拒绝可以用于以上4种情况的任何一种。 对于表中情况1和2(即向参照关系中插入新元组修改参照关系的元组外码上的值),一般只能拒绝。 对于情况3和4(从被参照关系中删除元组修改被参照关系R的元组主码上的值)还有其他有意义的选择 当更新被拒绝时,系统应当返回一个出错信息提示用户,2018年10月12日星期五,数据库系统原理,28,参照完整性(续),(2) 级联:进行更新,并且对更新导致违反参照完整性的参照关系元组进行相应更新。具体地说, 当删除被参照关系S中的元组tS破坏参照完整性时,同时删除参照关系R中所有违
15、反参照完整性的元组tR 修改被参照关系S的元组tS主码上的值而破坏参照完整性时,同时用tS主码上的新值修改参照关系R上违反参照完整性的元组tR的外码,2018年10月12日星期五,数据库系统原理,29,参照完整性(续),例如 学号为2010001的学生退学,删除Students中学号为2010001的Students元组的同时删除SC中Sno=2010001的选课记录 而学号为2010001的学生的学号修改为2010030时,可以同时将SC中Sno=2010001的元组的Sno修改为2010030,2018年10月12日星期五,数据库系统原理,30,参照完整性(续),(3) 置空值:进行更新,
16、并且对更新导致违反参照完整性的参照关系元组的外码置空值 这种处理方法仅当外码允许取空值时才能使用例如,如果允许教师所在院系属性取空值(尚未分配到具体院系),当学校的某个院系撤销时,可以在删除该院系在Departments中的记录的同时将TEACHERS中相应教师的所在院系属性置空值 (4) 置缺省值:进行更新,并且对更新导致违反参照完整性的参照关系元组的外码置缺省值;其中缺省值必须是被参照关系某元组主码上的值 DBMS应当提供上述处理措施,用户可根据具体情况进行选择,2018年10月12日星期五,数据库系统原理,31,SQL对参照完整性的支持,外码可以在创建基本表时用FOREIGN KEY子句
17、说明, 形式为:FOREIGN KEY (A1, Ak) REFERENCES () 指出修改和删除违反参照完整性约束时触发的动作;缺省时,违反参照完整性的修改和删除将被拒绝。,2018年10月12日星期五,数据库系统原理,32,SQL对参照完整性的支持(续),可以是如下两种形式之一:ON UPDATE ON DELETE ON DELETE ON UPDATE 其中可以是CASCADE、SET NULL、SET DEFAULT和NO ACTION 之一,分别表示级联、置空值、置缺省值和拒绝 ON DELETE 缺省时,违反参照完整性的删除将被拒绝 ON UPDATE 缺省时,违反参照完整性的
18、修改将被拒绝,2018年10月12日星期五,数据库系统原理,33,SQL对参照完整性的支持(续),例5.1 在前面,我们定义了Students、Courses和SC等基本表 如果我们希望在更新Students元组的主码时同时修改相应的SC元组的外码Sno,删除Students的元组时同时删除相应的SC元组;而更新Courses的元组时同时修改相应的SC元组的外码Cno,但不允许删除Courses的元组破坏参照完整性,则我们可以用如下语句创建基本表SC:,2018年10月12日星期五,数据库系统原理,34,SQL对参照完整性的支持(续),CREATE TABLE SC (Sno CHAR (9)
19、,Cno CHAR (5),Grade SMALLINT CHECK (Grade=0 AND Grade=100),PRIMARY KEY (Sno,Cno),FOREIGN KEY (Sno) REFERENCES Students (Sno) ON UPDATE CASCADE ON DELETE CASCADE,FOREIGN KEY (Cno) REFERENCES Courses (Cno) ON UPDATE CASCADE );,5.3 用户定义的完整性,2018年10月12日星期五,数据库系统原理,36,用户定义的完整性,不同的关系数据库根据其应用环境的不同,往往还需要一些特
20、殊的约束条件 用户定义的完整性即是针对某个特定关系数据库的约束条件,它反映某一具体应用所涉及的数据必须满足的语义要求 系统提供定义和检验这类完整性的统一处理方法,不再由应用程序承担这项工作,2018年10月12日星期五,数据库系统原理,37,用户定义的完整性,1. 属性约束 属性上的约束是指属性的取值必须来自其定义的值域 例如,可以规定学生成绩的取值范围为-100,性别的取值为“男”或“女”等 插入新元组和修改元组的属性值可能导致违反属性约束。 DBMS应当在插入或修改前进行属性约束检查。如果违反属性约束,插入或删除将被拒绝。,2018年10月12日星期五,数据库系统原理,38,5.3 用户定
21、义的完整性,5.3.1 属性上的约束条件的定义 5.3.2 属性上的约束条件检查和违约处理 5.3.3 元组上的约束条件的定义 5.3.4元组上的约束条件检查和违约处理,2018年10月12日星期五,数据库系统原理,39,5.3.1 属性上的约束条件的定义,CREATE TABLE时定义 列值非空(NOT NULL) 列值唯一(UNIQUE) 检查列值是否满足一个布尔表达式(CHECK),2018年10月12日星期五,数据库系统原理,40,属性上的约束条件的定义(续),不允许取空值 例5 在定义SC表时,说明Sno、Cno、Grade属性不允许取空值。,CREATE TABLE SC(Sno
22、CHAR(9) NOT NULL, Cno CHAR(4) NOT NULL, Grade SMALLINT NOT NULL, PRIMARY KEY (Sno, Cno) ); 如果在表级定义实体完整性,隐含了Sno,Cno不允许取空值,则在列级不允许取空值的定义就不必写了,2018年10月12日星期五,数据库系统原理,41,属性上的约束条件的定义(续),列值唯一,例6 建立部门表DEPT,要求部门名称Dname列取值唯一,部门编号Deptno列为主码CREATE TABLE DEPT(Deptno NUMERIC(2),Dname CHAR(9) UNIQUE,/*要求Dname列值唯一
23、*/Location CHAR(10),PRIMARY KEY (Deptno);,2018年10月12日星期五,数据库系统原理,42,属性上的约束条件的定义(续),用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);,2018年10月12日星
24、期五,数据库系统原理,43,5.3 用户定义的完整性,5.3.1 属性上的约束条件的定义 5.3.2 属性上的约束条件检查和违约处理 5.3.3 元组上的约束条件的定义 5.3.4元组上的约束条件检查和违约处理,2018年10月12日星期五,数据库系统原理,44,5.3.2 约束条件检查和违约处理,插入元组或修改属性的值时,RDBMS检查属性上的约束条件是否被满足 如果不满足则操作被拒绝执行,2018年10月12日星期五,数据库系统原理,45,5.3 用户定义的完整性,5.3.1 属性上的约束条件的定义 5.3.2 属性上的约束条件检查和违约处理 5.3.3 元组上的约束条件的定义 5.3.4
25、元组上的约束条件检查和违约处理,2018年10月12日星期五,数据库系统原理,46,5.3.3 元组上的约束条件的定义,在CREATE TABLE时可以用CHECK短语定义元组上的约束条件,即元组级的限制 同属性值限制相比,元组级的限制可以设置不同属性之间的取值的相互约束条件,2018年10月12日星期五,数据库系统原理,47,元组上的约束条件的定义(续),CREATE TABLE Student(Sno CHAR(9), Sname CHAR(8) NOT NULL,Ssex CHAR(2),Sage SMALLINT,Sdept CHAR(20),PRIMARY KEY (Sno),CHE
26、CK (Ssex=女 OR Sname NOT LIKE Ms.%)/*定义了元组中Sname和 Ssex两个属性值之间的约束条件*/); 性别是女性的元组都能通过该项检查,因为Ssex=女成立; 当性别是男性时,要通过检查则名字一定不能以Ms.打头,例9 当学生的性别是男时,其名字不能以Ms.打头。,2018年10月12日星期五,数据库系统原理,48,5.3 用户定义的完整性,5.3.1 属性上的约束条件的定义 5.3.2 属性上的约束条件检查和违约处理 5.3.3 元组上的约束条件的定义 5.3.4 元组上的约束条件检查和违约处理,2018年10月12日星期五,数据库系统原理,49,5.3
27、.4 元组上的约束条件检查和违约处理,插入元组或修改属性的值时,RDBMS检查元组上的约束条件是否被满足 如果不满足则操作被拒绝执行,2018年10月12日星期五,数据库系统原理,50,第五章 数据库完整性,5.4 完整性约束命名子句,2018年10月12日星期五,数据库系统原理,51,5.4 完整性约束命名子句,CONSTRAINT 约束CONSTRAINT PRIMARY KEY短语 | FOREIGN KEY短语 | CHECK短语 ,2018年10月12日星期五,数据库系统原理,52,完整性约束命名子句(续),例10 建立学生登记表Student,要求学号在9000099999之间,姓
28、名不能取空值,年龄小于30,性别只能是“男”或“女”。,2018年10月12日星期五,数据库系统原理,53,完整性约束命名子句(续),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 Studen
29、tKey PRIMARY KEY(Sno);,2018年10月12日星期五,数据库系统原理,54,完整性约束命名子句(续),在Student表上建立了5个约束条件,包括主码约束(命名为StudentKey)以及C1、C2、C3、C4四个列级约束。修改表中的完整性限制 使用ALTER TABLE语句修改表中的完整性限制,2018年10月12日星期五,数据库系统原理,55,完整性约束命名子句(续),例13 修改表Student中的约束条件,要求学号改为在900000999999之间,年龄由小于30改为小于40,2018年10月12日星期五,数据库系统原理,56,完整性约束命名子句(续),可以先删除
30、原来的约束条件,再增加新的约束条件ALTER TABLE StudentDROP CONSTRAINT C1;ALTER TABLE StudentADD CONSTRAINT C1 CHECK (Sno BETWEEN 900000 AND 999999);ALTER TABLE StudentDROP CONSTRAINT C3;ALTER TABLE StudentADD CONSTRAINT C3 CHECK (Sage 40);,5.5 触发器,2018年10月12日星期五,数据库系统原理,58,触发器,触发器(trigger)是特殊类型的存储过程,当某个事件发生时它自动执行。 要设
31、置触发器机制,必须满足两个要求:(1) 指明什么事件发生和满足什么条件执行触发器;(2) 指明触发器执行什么样的动作。 这种模型称作事件-条件-动作模型 数据库系统将像保存数据一样存储触发器。只要指定的事件发生,触发条件满足,相应的存储过程就被执行。 触发器的其他作用 例如,一个定时触发器可以在每个周末主动地制作某些定制的报表,而不必在用户要求之后才被动地完成这些任务。,2018年10月12日星期五,数据库系统原理,59,触发器(续),1. 为何需要触发器 DBMS提供了多种完整性约束定义和检查机制。然而,除了允许对违反参照完整性约束的删除和修改进行级联删除和修改外,违反完整性约束的更新都被简
32、单地拒绝。 触发器对示警或满足特定条件时自动执行某项任务是非常有用的,对实现复杂的完整性约束(如参照完整性不能覆盖的复杂约束)也是有用的。 两个例子: 银行的透支处理:银行允许用户透支,但存款余额不能取负值。透支(存款余额小于零)时可以将存款余额置零,并同时建立一笔贷款,其金额等于透支额。这样,当存款余额更新后小于零时不是简单地拒绝更新,而是触发一系列动作完成上述任务,同时避免破坏完整性约束。 存货预警:当库存量下降到最小库存量以下时,自动提示仓库管理人员订货或自动产生一个订单。自动触发一个过程来完成上述任务。,2018年10月12日星期五,数据库系统原理,60,5.6 触发器,5.6.1 定
33、义触发器 5.6.2 激活触发器 5.6.3 删除触发器,2018年10月12日星期五,数据库系统原理,61,5.6.1 定义触发器,CREATE TRIGGER语法格式CREATE TRIGGER BEFORE | AFTER ON FOR EACH ROW | STATEMENT WHEN ,2018年10月12日星期五,数据库系统原理,62,定义触发器(续),定义触发器的语法说明: 1. 创建者:表的拥有者 2. 触发器名 3. 表名:触发器的目标表 4. 触发事件:INSERT、DELETE、UPDATE 5. 触发器类型 行级触发器(FOR EACH ROW) 语句级触发器(FOR
34、EACH STATEMENT),2018年10月12日星期五,数据库系统原理,63,定义触发器(续),例如,假设在例11的TEACHER表上创建了一个AFTER UPDATE触发器。如果表TEACHER有1000行,执行如下语句:UPDATE TEACHER SET Deptno=5; 如果该触发器为语句级触发器,那么执行完该语句后,触发动作只发生一次 如果是行级触发器,触发动作将执行1000次,2018年10月12日星期五,数据库系统原理,64,定义触发器(续),触发条件 触发条件为真 省略WHEN触发条件 ,触发器激活后立即执行,触发动作体 触发动作体可以是一个匿名PL/SQL过程块 也可
35、以是对已创建存储过程的调用触发时间BEFORE 事件前AFTER 事件后,2018年10月12日星期五,数据库系统原理,65,定义触发器(续),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;,例18 定义一个BEFORE行级触发器,
36、为教师表Teacher定义完整性规则“教授的工资不得低于4000元,如果低于4000元,自动改为4000元”。,2018年10月12日星期五,数据库系统原理,66,定义触发器(续),首先建立工资变化表Sal_logCREATE TABLE Sal_log(Eno NUMERIC(4) references teacher(eno),Sal NUMERIC(7,2),Username char(10),Date TIMESTAMP);,例19定义AFTER行级触发器,当教师表Teacher的工资发生变化后就自动在工资变化表Sal_log中增加一条相应记录,2018年10月12日星期五,数据库系统
37、原理,67,定义触发器(续),例19(续)CREATE TRIGGER Insert_Sal AFTER INSERT ON Teacher /*触发事件是INSERT*/FOR EACH ROWAS BEGININSERT INTO Sal_log VALUES( new.Eno,new.Sal,CURRENT_USER,CURRENT_TIMESTAMP);END;CREATE TRIGGER Update_Sal AFTER UPDATE ON Teacher /*触发事件是UPDATE */FOR EACH ROWAS BEGIN IF (new.Sal old.Sal) THEN I
38、NSERT INTO Sal_log VALUES(new.Eno,new.Sal,CURRENT_USER,CURRENT_TIMESTAMP);END IF;END;,2018年10月12日星期五,数据库系统原理,68,5.6 触发器,5.6.1 定义触发器 5.6.2 激活触发器 5.6.3 删除触发器,2018年10月12日星期五,数据库系统原理,69,5.6.2 激活触发器,触发器的执行,是由触发事件激活的,并由数据库服务器自动执行 一个数据表上可能定义了多个触发器 同一个表上的多个触发器激活时遵循如下的执行顺序: 执行该表上的BEFORE触发器; 激活触发器的SQL语句; 执行该表
39、上的AFTER触发器。,2018年10月12日星期五,数据库系统原理,70,激活触发器(续),UPDATE Teacher SET Sal=800 WHERE Ename=陈平;执行顺序是: 执行触发器Insert_Or_Update_Sal 执行SQL语句“UPDATE Teacher SET Sal=800 WHERE Ename=陈平;” 执行触发器Insert_Sal; 执行触发器Update_Sal,例20执行修改某个教师工资的SQL语句,激活上述定义的触发器。,2018年10月12日星期五,数据库系统原理,71,5.6 触发器,5.6.1 定义触发器 5.6.2 激活触发器 5.6
40、.3 删除触发器,2018年10月12日星期五,数据库系统原理,72,5.6.3 删除触发器,删除触发器的SQL语法:DROP TRIGGER ON ;,触发器必须是一个已经创建的触发器,并且只能由具有相应权限的用户删除。,例21 删除教师表Teacher上的触发器Insert_SalDROP TRIGGER Insert_Sal ON Teacher;,2018年10月12日星期五,数据库系统原理,73,第五章 数据库完整性,5.7 小结,2018年10月12日星期五,数据库系统原理,74,小结,数据库的完整性是为了保证数据库中存储的数据是正确的。 关系数据库的完整性约束包括实体完整性、参照
41、完整性和用户定义的完整性。 为了保证数据的完整性,DBMS提供了定义约束、检查约束和违约处理机制。 实体完整性和参照完整性分别是对主码和外码取值的约束。违反实体完整性约束的数据更新将被拒绝。然而,对于违反参照完整性约束的更新,存在多种可能的处理方案。 SQL支持实体完整性和参照完整性,可以在定义基本表时说明主码和外码,并说明违反参照完整性的处理措施。,2018年10月12日星期五,数据库系统原理,75,小结(续),对于用户定义的约束,属性约束和关系约束可以在定义基本表时说明。 触发器定义某个事件发生并且满足相应条件自动执行的动作。触发器有多种用途,如实现商务规则、审计日志,甚至数据库以外的操作。虽然直到SQL-99标准才引入触发器,但是许多DBMS在此之前已经提供对触发器的支持。,