第5章数据库完整性.ppt
5.1 5.1 实体完整性实体完整性5.2 5.2 参照完整性参照完整性5.3 5.3 用户定义的完整性用户定义的完整性5.4 5.4 完整性约束命名字句完整性约束命名字句*5.5 5.5 域中的完整性限制域中的完整性限制5.6 5.6 触发器触发器5.7 5.7 小结小结第五章 数据库完整性1数据库完整性数据库完整性数据库的完整性数据库的完整性数据的数据的正确性正确性和和相容性相容性数据的完整性和安全性是两个不同概念数据的完整性和安全性是两个不同概念数据的完整性数据的完整性防止数据库中存在不符合语义的数据,也就是防止数防止数据库中存在不符合语义的数据,也就是防止数据库中存在不正确的数据据库中存在不正确的数据防范对象:不合语义的、不正确的数据防范对象:不合语义的、不正确的数据数据的安全性数据的安全性保护数据库防止恶意的破坏和非法的存取保护数据库防止恶意的破坏和非法的存取防范对象:非法用户和非法操作防范对象:非法用户和非法操作2数据库完整性数据库完整性(续续)为维护数据库的完整性,为维护数据库的完整性,DBMSDBMS必须:必须:n1.1.提供定义完整性约束条件的机制提供定义完整性约束条件的机制n2.2.提供完整性检查的方法提供完整性检查的方法n3.3.违约处理违约处理3第五章第五章 数据库完整性数据库完整性5.1 5.1 实体完整性实体完整性5.2 5.2 参照完整性参照完整性5.3 5.3 用户定义的完整性用户定义的完整性5.4 5.4 完整性约束命名字句完整性约束命名字句*5.5 5.5 域中的完整性限制域中的完整性限制5.6 5.6 触发器触发器5.7 5.7 小结小结45.1 5.1 实体完整性实体完整性5.1.1 实体完整性定义5.1.2 实体完整性检查和违约处理55.1.1 5.1.1 实体完整性定义实体完整性定义关系模型的实体完整性关系模型的实体完整性CREATE TABLECREATE TABLE中用中用PRIMARY KEYPRIMARY KEY定义定义单属性构成的码有两种说明方法单属性构成的码有两种说明方法 定义为列级约束条件定义为列级约束条件定义为表级约束条件定义为表级约束条件对多个属性构成的码只有一种说明方法对多个属性构成的码只有一种说明方法定义为表级约束条件定义为表级约束条件 6实体完整性定义实体完整性定义(续续)例例1 1 将将StudentStudent表中的表中的SnoSno属性定义为码属性定义为码 (1)(1)在列级定义主码在列级定义主码 CREATE TABLE StudentCREATE TABLE Student (SnoSno CHAR(9)PRIMARY KEY CHAR(9)PRIMARY KEY,SnameSname CHAR(20)NOT NULL CHAR(20)NOT NULL,SsexSsex CHAR(2)CHAR(2),Sage SMALLINTSage SMALLINT,SdeptSdept CHAR(20);CHAR(20);7实体完整性定义实体完整性定义(续续)(2)(2)在表级定义主码在表级定义主码 CREATE TABLE StudentCREATE TABLE Student (SnoSno CHAR(9)NOT NULL CHAR(9)NOT NULL,SnameSname CHAR(20)NOT NULL CHAR(20)NOT NULL,SsexSsex CHAR(2)CHAR(2),Sage SMALLINTSage SMALLINT,SdeptSdept CHAR(20)CHAR(20),PRIMARY KEY(PRIMARY KEY(SnoSno););8实体完整性定义实体完整性定义(续续)例例2 2将将SCSC表中的表中的SnoSno,CnoCno属性组定义为码属性组定义为码 CREATE TABLE SCCREATE TABLE SC (SnoSno CHAR(9)NOT NULL CHAR(9)NOT NULL,CnoCno CHAR(4)NOT NULL CHAR(4)NOT NULL,Grade SMALLINTGrade SMALLINT,PRIMARY KEY(PRIMARY KEY(SnoSno,CnoCno)/*)/*只能在表级定义主码只能在表级定义主码*/););95.1 5.1 实体完整性实体完整性5.1.1 5.1.1 实体完整性定义实体完整性定义5.1.2 5.1.2 实体完整性检查和违约处理实体完整性检查和违约处理105.1.2 5.1.2 实体完整性检查和违约处理实体完整性检查和违约处理插入或对主码列进行更新操作时,插入或对主码列进行更新操作时,RDBMSRDBMS按照按照实体完整性规则自动进行检查。包括:实体完整性规则自动进行检查。包括:1.1.检查主码值是否唯一,如果不唯一则拒检查主码值是否唯一,如果不唯一则拒绝插入或修改。绝插入或修改。2.2.检查主码的各个属性是否为空,只要有检查主码的各个属性是否为空,只要有一个为空就拒绝插入或修改。一个为空就拒绝插入或修改。11实体完整性检查和违约处理实体完整性检查和违约处理(续续)检查记录中主码值是否唯一的一种方法是进行检查记录中主码值是否唯一的一种方法是进行全表扫描全表扫描12实体完整性检查和违约处理实体完整性检查和违约处理(续续)另一种方法是另一种方法是索引索引 13第五章第五章 数据库完整性数据库完整性5.1 5.1 实体完整性实体完整性5.2 5.2 参照完整性参照完整性5.3 5.3 用户定义的完整性用户定义的完整性5.4 5.4 完整性约束命名字句完整性约束命名字句*5.5 5.5 域中的完整性限制域中的完整性限制5.6 5.6 触发器触发器5.7 5.7 小结小结145.2 5.2 参照完整性参照完整性5.2.1 5.2.1 参照完整性定义参照完整性定义5.2.2 5.2.2 参照完整性检查和违约处理参照完整性检查和违约处理155.2.1 5.2.1 参照完整性定义参照完整性定义关系模型的参照完整性定义关系模型的参照完整性定义在在CREATE TABLECREATE TABLE中用中用FOREIGN KEYFOREIGN KEY短语定义哪短语定义哪些列为外码些列为外码用用REFERENCESREFERENCES短语指明这些外码参照哪些表的短语指明这些外码参照哪些表的主码主码 16参照完整性定义参照完整性定义(续续)例如,关系例如,关系SCSC中一个元组表示一个学生选修的某门课程的成绩,中一个元组表示一个学生选修的某门课程的成绩,(SnoSno,CnoCno)是主码。是主码。SnoSno,CnoCno分别参照引用分别参照引用StudentStudent表的主码表的主码和和CourseCourse表的主码。表的主码。例例3 3 定义定义SCSC中的参照完整性中的参照完整性 CREATE TABLE SCCREATE TABLE SC (SnoSno CHAR(9)NOT NULL CHAR(9)NOT NULL,CnoCno CHAR(4)NOT NULL CHAR(4)NOT NULL,Grade SMALLINTGrade SMALLINT,PRIMARY KEY(PRIMARY KEY(Sno,CnoSno,Cno),/在表级定义实体完整性在表级定义实体完整性 FOREIGN KEY(FOREIGN KEY(SnoSno)REFERENCES)REFERENCES Student(SnoStudent(Sno),/*/*在表级定义参照完整性在表级定义参照完整性*/FOREIGN KEY(FOREIGN KEY(CnoCno)REFERENCES)REFERENCES Course(CnoCourse(Cno)/*/*在表级定义参照完整性在表级定义参照完整性*/););175.2 5.2 参照完整性参照完整性5.2.1 5.2.1 参照完整性定义参照完整性定义5.2.2 5.2.2 参照完整性检查和违约处理参照完整性检查和违约处理18参照完整性检查和违约处理参照完整性检查和违约处理可能破坏参照完整性的情况及违约处理被参照表被参照表(例如例如Student)Student)参照表(例如参照表(例如SCSC)违约处理违约处理可能破坏参照完整性可能破坏参照完整性 插入元组插入元组拒绝拒绝可能破坏参照完整性可能破坏参照完整性 修改外码值修改外码值拒绝拒绝删除元组删除元组 可能破坏参照完整性可能破坏参照完整性拒绝拒绝/级连删除级连删除/设置为空值设置为空值修改主码值修改主码值 可能破坏参照完整性可能破坏参照完整性拒绝拒绝/级连修改级连修改/设置为空值设置为空值19违约处理违约处理参照完整性违约处理参照完整性违约处理1.1.拒绝拒绝(NO ACTION)(NO ACTION)执行执行默认策略默认策略2.2.级联级联(CASCADE)(CASCADE)操作操作3.3.设置为空值(设置为空值(SET-NULLSET-NULL)对于参照完整性,除了应该定义外码,还应定义对于参照完整性,除了应该定义外码,还应定义外码外码列是否允许空值列是否允许空值20违约处理违约处理(续续)例例4 4 显式说明参照完整性的违约处理示例显式说明参照完整性的违约处理示例 CREATE TABLE SCCREATE TABLE SC (SnoSno CHAR(9)NOT NULL CHAR(9)NOT NULL,CnoCno CHAR(4)NOT NULL CHAR(4)NOT NULL,Grade SMALLINTGrade SMALLINT,PRIMARY KEYPRIMARY KEY(SnoSno,CnoCno),),FOREIGN KEY(FOREIGN KEY(SnoSno)REFERENCES)REFERENCES Student(SnoStudent(Sno)ON DELETE CASCADE /*ON DELETE CASCADE /*级联删除级联删除SCSC表中相应的元组表中相应的元组*/ON UPDATE CASCADE ON UPDATE CASCADE,/*/*级联更新级联更新SCSC表中相应的元组表中相应的元组*/FOREIGN KEY(FOREIGN KEY(CnoCno)REFERENCES)REFERENCES Course(CnoCourse(Cno)ON DELETE NO ACTION ON DELETE NO ACTION /*/*当删除当删除course course 表中的元组造成了与表中的元组造成了与SCSC表不一致时表不一致时拒绝删除拒绝删除*/ON UPDATE CASCADE ON UPDATE CASCADE /*/*当更新当更新coursecourse表中的表中的cnocno时,时,级联更新级联更新SCSC表中相应的元组表中相应的元组*/);21第五章第五章 数据库完整性数据库完整性5.1 5.1 实体完整性实体完整性5.2 5.2 参照完整性参照完整性5.3 5.3 用户定义的完整性用户定义的完整性5.4 5.4 完整性约束命名字句完整性约束命名字句*5.5 5.5 域中的完整性限制域中的完整性限制5.6 5.6 触发器触发器5.7 5.7 小结小结225.3 5.3 用户定义的完整性用户定义的完整性用户定义的完整性就是针对用户定义的完整性就是针对某一具体应用某一具体应用的数的数据必须满足的语义要求据必须满足的语义要求 RDBMSRDBMS提供,而不必由应用程序承担提供,而不必由应用程序承担235.3 5.3 用户定义的完整性用户定义的完整性5.3.1 5.3.1 属性上的约束条件的定义属性上的约束条件的定义5.3.2 5.3.2 属性上的约束条件检查和违约处理属性上的约束条件检查和违约处理 5.3.3 5.3.3 元组上的约束条件的定义元组上的约束条件的定义 5.3.45.3.4元组上的约束条件检查和违约处理元组上的约束条件检查和违约处理245.3.1 5.3.1 属性上的约束条件的定义属性上的约束条件的定义CREATE TABLECREATE TABLE时定义时定义列值非空(列值非空(NOT NULLNOT NULL)列值唯一(列值唯一(UNIQUEUNIQUE)检查列值是否满足一个布尔表达式(检查列值是否满足一个布尔表达式(CHECKCHECK)25属性上的约束条件的定义属性上的约束条件的定义(续续)1.1.不允许取空值不允许取空值 例例5 5在定义在定义SCSC表时,说明表时,说明SnoSno、CnoCno、GradeGrade属性不允属性不允许取空值。许取空值。CREATE TABLE SCCREATE TABLE SC (SnoSno CHAR(9)CHAR(9)NOT NULLNOT NULL,CnoCno CHAR(4)CHAR(4)NOT NULLNOT NULL,Grade SMALLINT Grade SMALLINT NOT NULLNOT NULL,PRIMARY KEY(PRIMARY KEY(SnoSno,CnoCno),/*/*如果在表级定义实体完整性,隐含了如果在表级定义实体完整性,隐含了SnoSno,CnoCno不允许不允许取空值,则在列级不允许取空值的定义就不必写了取空值,则在列级不允许取空值的定义就不必写了 */););26属性上的约束条件的定义属性上的约束条件的定义(续续)2.2.列值唯一列值唯一 例例6 6建立部门表建立部门表DEPTDEPT,要求部门名称要求部门名称DnameDname列取值唯一,列取值唯一,部门编号部门编号DeptnoDeptno列为主码列为主码.CREATE TABLE DEPT CREATE TABLE DEPT (DeptnoDeptno NUMERIC(2)NUMERIC(2),DnameDname CHAR(9)CHAR(9)UNIQUEUNIQUE,/*/*要求要求DnameDname列值唯一列值唯一*/Location CHAR(10)Location CHAR(10),PRIMARY KEY(PRIMARY KEY(DeptnoDeptno);27属性上的约束条件的定义属性上的约束条件的定义(续续)3.3.用用CHECKCHECK短语指定列值应该满足的条件短语指定列值应该满足的条件例例7 7 StudentStudent表的表的SsexSsex只允许取只允许取“男男”或或“女女”。CREATE TABLE StudentCREATE TABLE Student (SnoSno CHAR(9)PRIMARY KEY CHAR(9)PRIMARY KEY,SnameSname CHAR(8)NOT NULL CHAR(8)NOT NULL,SsexSsex CHAR(2)CHAR(2)CHECK(SsexCHECK(Ssex IN(IN(男男,女女),/*/*性别属性性别属性SsexSsex只允许取只允许取 男男 或或 女女*/*/Sage SMALLINT Sage SMALLINT,SdeptSdept CHAR(20)CHAR(20););285.3 5.3 用户定义的完整性用户定义的完整性5.3.1 5.3.1 属性上的约束条件的定义属性上的约束条件的定义5.3.2 5.3.2 属性上的约束条件检查和违约处理属性上的约束条件检查和违约处理 5.3.3 5.3.3 元组上的约束条件的定义元组上的约束条件的定义 5.3.45.3.4元组上的约束条件检查和违约处理元组上的约束条件检查和违约处理295.3.2 5.3.2 属性上的约束条件检查和违约处理属性上的约束条件检查和违约处理插入元组或修改属性的值时,插入元组或修改属性的值时,RDBMSRDBMS检查属性检查属性上的约束条件是否被满足上的约束条件是否被满足如果不满足则操作被拒绝执行如果不满足则操作被拒绝执行 305.3 5.3 用户定义的完整性用户定义的完整性5.3.1 5.3.1 属性上的约束条件的定义属性上的约束条件的定义5.3.2 5.3.2 属性上的约束条件检查和违约处理属性上的约束条件检查和违约处理 5.3.3 5.3.3 元组上的约束条件的定义元组上的约束条件的定义 5.3.45.3.4元组上的约束条件检查和违约处理元组上的约束条件检查和违约处理315.3.3 5.3.3 元组上的约束条件的定义元组上的约束条件的定义在在CREATE TABLECREATE TABLE中可以用中可以用CHECKCHECK短语定义元组上短语定义元组上的约束条件,即的约束条件,即元组级的限制元组级的限制同属性值限制相比,元组级的限制可以设置不同属性值限制相比,元组级的限制可以设置不同属性之间的取值的相互约束条件同属性之间的取值的相互约束条件 32元组上的约束条件的定义元组上的约束条件的定义(续续)例例9 9当学生的性别是男时,其名字不能以当学生的性别是男时,其名字不能以Ms.Ms.打头。打头。CREATE TABLE StudentCREATE TABLE Student (SnoSno CHAR(9)CHAR(9),SnameSname CHAR(8)NOT NULL CHAR(8)NOT NULL,SsexSsex CHAR(2)CHAR(2),Sage SMALLINTSage SMALLINT,SdeptSdept CHAR(20)CHAR(20),PRIMARY KEY(PRIMARY KEY(SnoSno),CHECK(CHECK(SsexSsex=女女 OR OR SnameSname NOT LIKE Ms.%)NOT LIKE Ms.%)/*/*定义了元组中定义了元组中SnameSname和和 SsexSsex两个属性值之间的约束条件两个属性值之间的约束条件*/);性别是女性的元组都能通过该项检查,因为性别是女性的元组都能通过该项检查,因为SsexSsex=女女成立;成立;当性别是男性时,要通过检查则名字一定不能以当性别是男性时,要通过检查则名字一定不能以Ms.Ms.打头打头335.3 5.3 用户定义的完整性用户定义的完整性5.3.1 5.3.1 属性上的约束条件的定义属性上的约束条件的定义5.3.2 5.3.2 属性上的约束条件检查和违约处理属性上的约束条件检查和违约处理 5.3.3 5.3.3 元组上的约束条件的定义元组上的约束条件的定义 5.3.4 5.3.4 元组上的约束条件检查和违约处理元组上的约束条件检查和违约处理345.3.4 5.3.4 元组上的约束条件检查和违约处理元组上的约束条件检查和违约处理插入元组或修改属性的值时,插入元组或修改属性的值时,RDBMSRDBMS检查元组上检查元组上的约束条件是否被满足的约束条件是否被满足.如果不满足则操作被拒绝执行如果不满足则操作被拒绝执行.35第五章第五章 数据库完整性数据库完整性5.1 5.1 实体完整性实体完整性5.2 5.2 参照完整性参照完整性5.3 5.3 用户定义的完整性用户定义的完整性5.4 5.4 完整性约束命名子句完整性约束命名子句*5.5 5.5 域中的完整性限制域中的完整性限制5.6 5.6 触发器触发器5.7 5.7 小结小结365.4 5.4 完整性约束命名子句完整性约束命名子句CONSTRAINT CONSTRAINT 约束约束 格式:格式:CONSTRAINT CONSTRAINT PRIMARY KEY(column_name)PRIMARY KEY(column_name)|FOREIGN KEY(column_name)REFERENCES(column_name)|FOREIGN KEY(column_name)REFERENCES(column_name)|CHECK(condition_expression)|CHECK(condition_expression)37完整性约束命名子句完整性约束命名子句(续续)例例1010建立学生登记表建立学生登记表StudentStudent,要求学号在要求学号在90000999999000099999之间,之间,姓名不能取空值,年龄小于姓名不能取空值,年龄小于3030,性别只能是,性别只能是“男男”或或“女女”。CREATE TABLE studentCREATE TABLE student (SnoSno NUMERIC(6)NUMERIC(6)CONSTRAINT C1 CHECK(CONSTRAINT C1 CHECK(SnoSno BETWEEN 90000 AND 99999)BETWEEN 90000 AND 99999),SnameSname CHAR(20)CHAR(20)CONSTRAINT C2 NOT NULLCONSTRAINT C2 NOT NULL,Sage NUMERIC(3)Sage NUMERIC(3)CONSTRAINT C3 CHECK(Sage30)CONSTRAINT C3 CHECK(Sage30),SsexSsex CHAR(2)CHAR(2)CONSTRAINT C4 CHECK(CONSTRAINT C4 CHECK(SsexSsex IN(IN(男男,女女),),CONSTRAINT CONSTRAINT StudentKeyStudentKey PRIMARY PRIMARY KEY(SnoKEY(Sno););在在StudentStudent表上建立了表上建立了5 5个约束条件,包括主码约束(命名为个约束条件,包括主码约束(命名为StudentKeyStudentKey)以及以及C1C1、C2C2、C3C3、C4C4四个列级约束。四个列级约束。38完整性约束命名子句完整性约束命名子句(续续)2.2.修改表中的完整性限制修改表中的完整性限制使用使用ALTER TABLEALTER TABLE语句修改表中的完整性限制语句修改表中的完整性限制39完整性约束命名子句完整性约束命名子句(续续)例例1313 修改表修改表StudentStudent中的约束条件,要求学号改为在中的约束条件,要求学号改为在900000999999900000999999之间,年龄由小于之间,年龄由小于3030改为小于改为小于4040n先删除原来的约束条件,再增加新的约束条件先删除原来的约束条件,再增加新的约束条件 ALTER TABLE Student ALTER TABLE Student DROP CONSTRAINT C1;DROP CONSTRAINT C1;ALTER TABLE StudentALTER TABLE Student ADD CONSTRAINT C1 CHECK(ADD CONSTRAINT C1 CHECK(SnoSno BETWEEN 900000 BETWEEN 900000 AND 999999);AND 999999);ALTER TABLE Student DROP CONSTRAINT C3;ALTER TABLE Student DROP CONSTRAINT C3;ALTER TABLE StudentALTER TABLE Student ADD CONSTRAINT C3 ADD CONSTRAINT C3 CHECK(SageCHECK(Sage40);40);40第五章第五章 数据库完整性数据库完整性5.1 5.1 实体完整性实体完整性5.2 5.2 参照完整性参照完整性5.3 5.3 用户定义的完整性用户定义的完整性5.4 5.4 完整性约束命名字句完整性约束命名字句*5.5 5.5 域中的完整性限制域中的完整性限制5.6 5.6 触发器触发器5.7 5.7 小结小结41*5.5 5.5 域中的完整性限制域中的完整性限制SQLSQL支持域的概念,并可以用支持域的概念,并可以用CREATE DOMAINCREATE DOMAIN语句建立语句建立一个域以及该域应该满足的完整性约束条件。一个域以及该域应该满足的完整性约束条件。例例1414建立一个性别域,并声明性别域的取值范围建立一个性别域,并声明性别域的取值范围 CREATE DOMAIN CREATE DOMAIN GenderDomainGenderDomain CHAR(2)CHAR(2)CHECK(VALUE IN(CHECK(VALUE IN(男男,女女););这样例这样例1010中对中对SsexSsex的说明可以改写为的说明可以改写为 SsexSsex GenderDomainGenderDomain例例1515建立一个性别域建立一个性别域GenderDomainGenderDomain,并对其中的限制命名并对其中的限制命名 CREATE DOMAIN CREATE DOMAIN GenderDomainGenderDomain CHAR(2)CHAR(2)CONSTRAINT GD CHECK(VALUE IN(CONSTRAINT GD CHECK(VALUE IN(男男,女女););42域中的完整性限制域中的完整性限制(续续)例例1616删除域删除域GenderDomainGenderDomain的限制条件的限制条件GDGD。ALTER DOMAIN ALTER DOMAIN GenderDomainGenderDomain DROP CONSTRAINT GD;DROP CONSTRAINT GD;例例1717在域在域GenderDomainGenderDomain上增加限制条件上增加限制条件GDDGDD。ALTER DOMAIN ALTER DOMAIN GenderDomainGenderDomain ADD CONSTRAINT GDD CHECK(VALUE IN(1,0);ADD CONSTRAINT GDD CHECK(VALUE IN(1,0);通过例通过例1616和例和例1717,就把性别的取值范围由,就把性别的取值范围由(男男,女女)改为改为 (1(1,0)0)43第五章第五章 数据库完整性数据库完整性5.1 5.1 实体完整性实体完整性5.2 5.2 参照完整性参照完整性5.3 5.3 用户定义的完整性用户定义的完整性5.4 5.4 完整性约束命名字句完整性约束命名字句*5.5 5.5 域中的完整性限制域中的完整性限制5.6 5.6 触发器触发器5.7 5.7 小结小结44触发器触发器触发器(触发器(TriggerTrigger)是用户定义在关系表上的是用户定义在关系表上的一类由一类由事件驱动事件驱动的特殊过程。的特殊过程。由服务器自动激活由服务器自动激活可以进行更为复杂的检查和操作,具有更精细可以进行更为复杂的检查和操作,具有更精细和更强大的数据控制能力和更强大的数据控制能力 455.6 5.6 触发器触发器5.6.1 5.6.1 定义触发器定义触发器 5.6.2 5.6.2 激活触发器激活触发器 5.6.3 5.6.3 删除触发器删除触发器 465.6.1 5.6.1 定义触发器定义触发器CREATE TRIGGERCREATE TRIGGER语法一般格式语法一般格式(SQL Server)(SQL Server)CREATE TRIGGER CREATE TRIGGER ON ON FOR FOR AS AS IF IF BEGINBEGIN END END语法说明语法说明:1.1.创建权限:表的拥有者(创建权限:表的拥有者(db_ownerdb_owner或或db_ddladmindb_ddladmin)2.2.触发器名:合法标识符触发器名:合法标识符3.3.表名:触发器的目标表或视图表名:触发器的目标表或视图4.4.触发事件:触发事件:INSERTINSERT、DELETEDELETE、UPDATEUPDATE5.5.触发条件触发条件:条件为真或缺省条件为真或缺省IFIF6.6.触发体:触发体:SQLSQL语句块或存储过程的调用语句块或存储过程的调用47定义触发器定义触发器(续续)示例示例1.1.为为studentstudent表定义一个表定义一个insert_studentinsert_student触发器,其完触发器,其完整性规则是整性规则是“学生入学时年龄不得小于学生入学时年龄不得小于1212岁岁”。CREATE TRIGGER CREATE TRIGGER insert_studentinsert_student ON student ON student FOR FOR insert insert AS /*AS /*触发事件是插入操作触发事件是插入操作*/declare declare syearsyear smallintsmallint select select syearsyear=sage from inserted=sage from inserted if if syearsyear12 /*12 /*定义触发动作体定义触发动作体*/begin begin raiserrorraiserror(学生入学时年龄不得小于学生入学时年龄不得小于1212岁岁,16,1),16,1)rollback transaction rollback transaction end end48定义触发器定义触发器(续续)例例18.18.定义一个定义一个insert_update_teacherinsert_update_teacher触发器,为教师表触发器,为教师表teacherteacher定义完整性规则定义完整性规则“教授的工资不得低于教授的工资不得低于40004000元,如果元,如果低于低于40004000元元,自动改为自动改为40004000元元”。建立教师表建立教师表:create table teachercreate table teacher (tnotno char(4)primary char(4)primary key,tnamekey,tname char(10)not null,char(10)not null,job char(8),sal job char(8),sal smallint,depsmallint,dep char(10);char(10);建立触发器:建立触发器:CREATE TRIGGER CREATE TRIGGER insert_update_teacherinsert_update_teacher ON teacher ON teacher FOR FOR insert,updateinsert,update /*/*触发事件是插入或更新操作触发事件是插入或更新操作*/AS declare AS declare tsaltsal smallint,tjobsmallint,tjob char(8)char(8)select select tsaltsal=sal,tjobsal,tjob=job from inserted=job from inserted if if tsaltsal4000 and 4000 and tjobtjob=教授教授 /*/*定义触发动作体定义触发动作体*/update teacher set update teacher set salsal=4000 from=4000 from teacher,insertedteacher,inserted where where teacher.tnoteacher.tno=inserted.tnoinserted.tno测试测试:insert into teacher values(1001,马莉马莉,教授教授,3400,CS)49定义触发器定义触发器(续续)例例19.19.定义一个触发器定义一个触发器up_ins_teacherup_ins_teacher,当教师表,当教师表teacherteacher的工资发的工资发生变化后就自动在工资变化表生变化后就自动在工资变化表Sal_logSal_log中增加一条相应记录中增加一条相应记录.建立工资变化表建立工资变化表:CREATE TABLE CREATE TABLE sal_logsal_log (tnotno char(4)references char(4)references teacher(tnoteacher(tno),),tnametname char(10),char(10),salsal smallint,tdatesmallint,tdate datetimedatetime);定义触发器定义触发器:CREATE TRIGGER CREATE TRIGGER up_ins_teacherup_ins_teacher ON teacher ON teacher FOR FOR insert,updateinsert,update /*/*触发事件是插入或更新操作触发事件是插入或更新操作*/AS declare AS declare tnotno char(4),sal char(4),sal smallint,tnamesmallint,tname char(10)char(10)select select tnotno=tno,tnametno,tname=tname,saltname,sal=salsal from inserted;from inserted;insert into insert into sal_logsal_log values(tno,tname,sal,getdatevalues(tno,tname,sal,getdate();();测试测试:insert into teacher values(1005,王伟王伟,教授教授,6400,CS);update teacher set sal=6745 where tno=1005505.6.2 5.6.2 激活触发器激活触发器触发器的执行,是由触发器的执行,是由触发事件激活触发事件激活的,并由数据库服务的,并由数据库服务器自动执行器自动执行.一个数据表上可能定义了一个数据表上可能定义了多个触发器多个触发器.例例20.20.执行修改某个教师工资的执行修改某个教师工资的SQLSQL语句,激活上述定义的语句,激活上述定义的触发器。触发器。UPDATE teacher SET Sal=800 WHERE UPDATE teacher SET Sal=800 WHERE tnametname=陈平陈平;执行顺序是:执行顺序是:执行执行SQLSQL语句语句“UPDATE teacher SET Sal=800 WHERE UPDATE teacher SET Sal=800 WHERE tnametname=陈平陈平;”执行触发器执行触发器Insert_Update_teacherInsert_Update_teacher执行触发器执行触发器Up_ins_teacherUp_ins_teacher 515.6.3 5.6.3 删除触发器删除触发器删除触发器的删除触发器的SQLSQL语法:语法:DROP TRIGGER DROP TRIGGER,2,ON ON 触发器必须是一个已经创建的触发器,并且只能由具有触发器必须是一个已经创建的触发器,并且只能由具有相应权限的用户删除。相应权限的用户删除。例例2121 删除教师表删除教师表TeacherTeacher上的触发器上的触发器Insert_SalInsert_Sal DROP TRIGGER Insert_Sal ON Teacher;DROP TRIGGER Insert_Sal ON Teacher;52第五章第五章 数据库完整性数据库完整性5.1 5.1 实体完整性实体完整性5.2 5.2 参照完整性参照完整性5.3 5.3 用户定义的完整性用户定义的完整性5.4 5.4 完整性约束命名字句完整性约束命名字句*5.5 5.5 域中的完整性限制域中的完整性限制5.6