第5章数据库系统概论(第4版)课件.ppt
本章目标:本章目标:掌握数据库的完整性概念,掌握数据库的完整性概念,以及用以及用SQLSQL语言定义关系模式的完整性约语言定义关系模式的完整性约束条件。束条件。第五章第五章 数据库完整性数据库完整性1/6/2023第五章第五章 数据库完整性数据库完整性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 小结小结2 2重点和难点重点和难点o重点:重点:n掌握掌握DBMSDBMS完整性控制机制的三个方面,即完完整性控制机制的三个方面,即完整性约束条件的定义、检查和违约处理。整性约束条件的定义、检查和违约处理。n用用SQLSQL语言定义关系模式的完整性约束条件。语言定义关系模式的完整性约束条件。包括定义主码、参照完整性;定义与应用有包括定义主码、参照完整性;定义与应用有关的完整性。关的完整性。o难点:难点:n如何实现完整性的策略,以确保数据的正确如何实现完整性的策略,以确保数据的正确与有效。较复杂的是参照完整性的实现机制。与有效。较复杂的是参照完整性的实现机制。3 3数据库完整性数据库完整性o数据库的完整性数据库的完整性n数据的数据的正确性正确性和和相容性相容性o数据的完整性和安全性是两个不同概念数据的完整性和安全性是两个不同概念n数据的完整性数据的完整性u防止数据库中存在不正确的数据防止数据库中存在不正确的数据u防范对象:不合语义的、不正确的数据防范对象:不合语义的、不正确的数据n数据的安全性数据的安全性u防止恶意的破坏和非法的存取防止恶意的破坏和非法的存取u防范对象:非法用户和非法操作防范对象:非法用户和非法操作4 4数据库完整性数据库完整性(续续)o为维护数据库的完整性,为维护数据库的完整性,DBMSDBMS必须:必须:n提供定义完整性约束条件的机制提供定义完整性约束条件的机制n提供完整性检查的方法提供完整性检查的方法n违约处理违约处理-目前商用的目前商用的DBMSDBMS产品都支持完整性控制产品都支持完整性控制o本章重点讲解本章重点讲解SQLSQL语言中实现完整性控语言中实现完整性控制功能的方法制功能的方法5 55.1 5.1 实体完整性实体完整性5.1.1 5.1.1 实体完整性定义实体完整性定义5.1.2 5.1.2 实体完整性检查和违约处理实体完整性检查和违约处理6 65.1.1 5.1.1 实体完整性定义实体完整性定义o关系模型的实体完整性关系模型的实体完整性nCREATE TABLECREATE TABLE中用中用PRIMARY KEYPRIMARY KEY定义定义o单属性构成的码有两种定义方法单属性构成的码有两种定义方法 n定义为列级约束条件定义为列级约束条件n定义为表级约束条件定义为表级约束条件o对多个属性构成的码只有一种定义方法对多个属性构成的码只有一种定义方法n定义为表级约束条件定义为表级约束条件 7 7实体完整性定义实体完整性定义(续续)o 例例11将将StudentStudent表中的表中的SnoSno属性定义为属性定义为码码n在列级定义主码:在列级定义主码:在属性后增加关键字在属性后增加关键字 CREATE TABLE StudentCREATE TABLE Student (SnoSno CHAR(9)CHAR(9)PRIMARY KEY PRIMARY KEY,SnameSname CHAR(20)NOT NULL CHAR(20)NOT NULL,SsexSsex CHAR(2)CHAR(2),Sage SMALLINTSage SMALLINT,SdeptSdept CHAR(20);CHAR(20);8 8实体完整性定义实体完整性定义(续续)n在表级定义主码:在表级定义主码:在属性表中加入额外的定义在属性表中加入额外的定义主码的子句:主码的子句:PRIMARY KEY(PRIMARY KEY(主码属性名表主码属性名表)CREATE TABLE StudentCREATE TABLE Student (SnoSno CHAR(9)CHAR(9),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););9 9实体完整性定义实体完整性定义(续续)例例22将将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)/*/*只能在表级定义主码只能在表级定义主码*/););10105.1.2 5.1.2 实体完整性检查和违约处理实体完整性检查和违约处理o插入插入或对主码列进行或对主码列进行更新更新操作时,操作时,RDBMSRDBMS按照实体完整性规则自动进行检按照实体完整性规则自动进行检查。包括:查。包括:n检查主码值是否唯一,不唯一则拒绝检查主码值是否唯一,不唯一则拒绝n检查检查主码的各个属性是否为空主码的各个属性是否为空,只要有一,只要有一个为空就拒绝个为空就拒绝u检查记录中主码值是否唯一的方法:检查记录中主码值是否唯一的方法:全表扫描全表扫描u提高提高实体完整性检查效率的方法:实体完整性检查效率的方法:索引索引11115.2 5.2 参照完整性参照完整性5.2.1 5.2.1 参照完整性定义参照完整性定义5.2.2 5.2.2 参照完整性检查和违约处理参照完整性检查和违约处理12125.2.1 5.2.1 参照完整性定义参照完整性定义o关系模型的参照完整性定义关系模型的参照完整性定义n在在CREATE TABLECREATE TABLE中用中用FOREIGN KEYFOREIGN KEY短语定短语定义哪些列为外码义哪些列为外码n用用REFERENCESREFERENCES短语指明这些外码参照哪些短语指明这些外码参照哪些表的主码表的主码 1313参照完整性定义参照完整性定义(例例)o关系关系SCSC:(Sno,CnoSno,Cno)是是主码。主码。Sno,CnoSno,Cno分别参分别参照引用照引用StudentStudent表的主码和表的主码和CourseCourse表的主码表的主码 例例33定义定义SCSC中的参照完整性中的参照完整性 CREATE TABLE SCCREATE TABLE SC (SnoSno CHAR(9)NOT CHAR(9)NOT NULL,CnoNULL,Cno CHAR(4)NOT NULL,CHAR(4)NOT NULL,Grade SMALLINT,Grade 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)/*/*在表级定义参照完整性在表级定义参照完整性*/);/);14145.2.2 5.2.2 参照完整性检查和违约处理参照完整性检查和违约处理o参照完整性:参照完整性:将两个表中的相将两个表中的相应应元元组联组联系系起来起来o可能破坏参照完整性的操作:可能破坏参照完整性的操作:对对参照表和参照表和被参照表的增、被参照表的增、删删、改、改1515参照完整性检查和违约处理参照完整性检查和违约处理o 例例 对对表表SCSC和和StudentStudent,可能破坏可能破坏参照完整参照完整性的操作情况性的操作情况nSCSC表增加一个元表增加一个元组组n修改修改SCSC表的一个元表的一个元组组n从从StudentStudent表表删删除一个元除一个元组组n修改修改StudentStudent表中表中一个元一个元组组的的SnoSno属性属性值值1616参照完整性检查和违约处理参照完整性检查和违约处理o 练习练习 对对表表SCSC和和CourseCourse,可能破坏,可能破坏参照完整参照完整性的操作情况性的操作情况nSCSC表增加一个元表增加一个元组组n修改修改SCSC表的一个元表的一个元组组n从从CourseCourse表表删删除一个元除一个元组组n修改修改CourseCourse表中表中一个元一个元组组的的CnoCno属性属性值值1717参照完整性检查和违约处理参照完整性检查和违约处理可能破坏参照完整性的情况及可能破坏参照完整性的情况及违约处违约处理理被参照表被参照表(例如例如Student)Student)参照表参照表(例如例如SC)SC)违约违约处理处理可能破坏可能破坏参照完整性参照完整性 插入元组插入元组拒绝拒绝可能破坏可能破坏参照完整性参照完整性 修改外码值修改外码值拒绝拒绝删除元组删除元组可能破坏可能破坏参照完整性参照完整性拒绝拒绝/级连删级连删除除/设置为空设置为空值值修改主码值修改主码值可能破坏可能破坏参照完整性参照完整性拒绝拒绝/级连修级连修改改/设置为空设置为空值值1818违约处理违约处理o参照完整性违约处理参照完整性违约处理n拒绝拒绝(NO ACTION)(NO ACTION)执行执行u默认策略默认策略n级联级联(CASCADE)(CASCADE)操作操作u删除删除/修改被参照表的某元组时,则删除修改被参照表的某元组时,则删除/修修改参照表中不一致的元组改参照表中不一致的元组n设置为空值设置为空值(SET-NULL)(SET-NULL)u删除删除/修改被参照表的某元组时,则设置参修改被参照表的某元组时,则设置参照表中不一致的元组的对应属性为空值照表中不一致的元组的对应属性为空值1919违约处理违约处理n设置为空值设置为空值(SET-NULL)(SET-NULL)u对于参照完整性,除了应该定义外码,还对于参照完整性,除了应该定义外码,还应定义应定义外码列是否允许空值外码列是否允许空值n当参照表与被参照表的操作违反了参照完整当参照表与被参照表的操作违反了参照完整性时性时u系统选用默认策略,即拒绝执行系统选用默认策略,即拒绝执行u若想让系统采取其他策略,必须在创建表若想让系统采取其他策略,必须在创建表时显式地说明时显式地说明2020在主表中修改主码例在主表中修改主码例o例:例:将将S S关系中关系中SnoSno=950001=950001的元组中的元组中SnoSno值改为值改为960123960123。设。设SCSC关系中有关系中有4 4个元组的个元组的SnoSno=950001=950001n级联修改:级联修改:将将SCSC关系中关系中4 4个个SnoSno=950001=950001元组元组中的中的SnoSno值也改为值也改为960123960123。若参照关系同时。若参照关系同时又是另一关系的被参照关系,则修改操作又是另一关系的被参照关系,则修改操作会继续级联下去会继续级联下去2121在主表中修改主码例在主表中修改主码例n受限修改受限修改:只有当只有当SCSC中没有任何元组的中没有任何元组的SnoSno=950001=950001时,才能修改时,才能修改S S表中表中SnoSno=950001=950001的元组的的元组的SnoSno值值(改为改为960123)960123)n置空值修改:置空值修改:将将S S表中表中SnoSno=950001=950001的元组的的元组的SnoSno值改为值改为960123,960123,而将而将SCSC表中所有表中所有SnoSno=950001=950001的元组的的元组的SnoSno值置为空值。值置为空值。o在学生选课数据库中在学生选课数据库中只有前二种方法是只有前二种方法是正确的正确的(级联修改、受限修改级联修改、受限修改)2222违约处理违约处理(续续)n 例例44显式说明参照完整性违约处理示例显式说明参照完整性违约处理示例CREATE TABLE SCCREATE TABLE SC(SnoSno CHAR(9)NOT CHAR(9)NOT NULL,CnoNULL,Cno CHAR(4)NOT NULL,CHAR(4)NOT NULL,Grade SMALLINT,PRIMARY Grade SMALLINT,PRIMARY KEY(Sno,CnoKEY(Sno,Cno),),FOREIGN KEY(FOREIGN KEY(SnoSno)REFERENCES)REFERENCES Student(SnoStudent(Sno)ON DELETE CASCADEON DELETE CASCADE /*/*级联删除级联删除SCSC表中相应的元组表中相应的元组*/ON UPDATE CASCADEON UPDATE CASCADE,/*/*级联更新级联更新SCSC表中相应的元组表中相应的元组*/FOREIGN KEY(FOREIGN KEY(CnoCno)REFERENCES)REFERENCES Course(CnoCourse(Cno)ON DELETE NO ACTIONON DELETE NO ACTION /*/*当删除当删除coursecourse表中的元组造成了与表中的元组造成了与SCSC表不一致时表不一致时拒绝删除拒绝删除*/ON UPDATE CASCADEON UPDATE CASCADE /*/*当更新当更新coursecourse表中的表中的cnocno时,时,级联更新级联更新SCSC表中相应的元组表中相应的元组*/)2323ON DELETE CASCADEON DELETE CASCADE-级连删除级连删除oDELETE FROM SC WHERE DELETE FROM SC WHERE SnoSno=1=1n则只删除则只删除SCSC的一条记录的一条记录,Student,Student表的相应表的相应记录不会被删除记录不会被删除oDELETE FROM Student WHERE DELETE FROM Student WHERE SnoSno=11n不但删除不但删除StudentStudent的一条记录,而且表的一条记录,而且表SCSC中中SnoSno=1=1同学的所有选修记录也会被同学的所有选修记录也会被级连删除级连删除24245.3 5.3 用户定义的完整性用户定义的完整性o用户定义的完整性就是针对用户定义的完整性就是针对某一具体应某一具体应用用的数据必须满足的语义要求的数据必须满足的语义要求 oRDBMSRDBMS提供定义和检验机制,而不必由提供定义和检验机制,而不必由应用程序承担应用程序承担25255.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 元组上的约束条件检查和违约处理元组上的约束条件检查和违约处理26265.3.1 5.3.1 属性上的约束条件的定义属性上的约束条件的定义oCREATE TABLECREATE TABLE时定义时定义n列值非空列值非空(NOT NULL)(NOT NULL)n列值唯一列值唯一(UNIQUE)(UNIQUE)n检查列值是否满足一个布尔表达式检查列值是否满足一个布尔表达式(CHECK)(CHECK)2727属性上的约束条件的定义属性上的约束条件的定义(续续)1.1.不允许取空值不允许取空值 例例55定义定义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(Sno,CnoSno,Cno)/*/*如果在表级定义实体完整性,隐含了如果在表级定义实体完整性,隐含了SnoSno,CnoCno不不允许取空值允许取空值,则在列级不允许取空值的定义就不必写,则在列级不允许取空值的定义就不必写了了*/););CREATE TABLE SCCREATE TABLE SC (SnoSno CHAR(9)CHAR(9),CnoCno CHAR(4)CHAR(4),Grade SMALLINT Grade SMALLINT NOT NULLNOT NULL,PRIMARY KEY(PRIMARY KEY(Sno,CnoSno,Cno););2828属性上的约束条件的定义属性上的约束条件的定义(续续)2.2.列值唯一列值唯一 例例66建立部门表建立部门表DEPTDEPT,要求部门名称要求部门名称DnameDname属性属性列取值唯一,部门编号列取值唯一,部门编号DeptnoDeptno属性列为主码属性列为主码 CREATE TABLE DEPTCREATE 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);2929属性上的约束条件的定义属性上的约束条件的定义(续续)3.3.用用CHECKCHECK短语指定列值应满足的条件短语指定列值应满足的条件o 例例77StudentStudent表的表的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(CHECK(SsexSsex IN(IN(男男,女女),/*/*性别属性性别属性SsexSsex只允许取只允许取 男男 或或 女女*/*/Sage SMALLINT,Sage SMALLINT,SdeptSdept CHAR(20);CHAR(20);3030属性上的约束条件的定义属性上的约束条件的定义(续续)o 例例88SCSC表的表的GradeGrade只允许取只允许取0-1000-100的数字的数字 CREATE TABLE SCCREATE TABLE SC (SnoSno CHAR(9),CHAR(9),CnoCno CHAR(4)NOT NULL,CHAR(4)NOT NULL,Grade SMALLINT Grade SMALLINT CHECK(Grade=0 AND Grade=0 AND Grade=100),/*Grade/*Grade属性只允许取属性只允许取0-1000-100的数字的数字*/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)31315.3.2 5.3.2 属性上的约束条件检查和违约处理属性上的约束条件检查和违约处理o插入元组或修改属性的值时,插入元组或修改属性的值时,RDBMSRDBMS检检查属性上的约束条件是否被满足查属性上的约束条件是否被满足o如果不满足则操作被拒绝执行如果不满足则操作被拒绝执行 32325.3.3 5.3.3 元组上的约束条件的定义元组上的约束条件的定义o在在CREATE TABLECREATE TABLE时可以用时可以用CHECKCHECK短语定短语定义元组上的约束条件,即义元组上的约束条件,即元组级的限制元组级的限制o同属性值限制相比,元组级的限制可以同属性值限制相比,元组级的限制可以设置不同属性之间取值的相互约束条件设置不同属性之间取值的相互约束条件 3333元组上的约束条件的定义元组上的约束条件的定义(续续)例例99当学生的性别是男时当学生的性别是男时,其名字不能以其名字不能以Ms.Ms.打头打头 CREATE TABLE StudentCREATE TABLE Student (SnoSno CHAR(9),CHAR(9),SnameSname CHAR(8)NOT NULL,CHAR(8)NOT NULL,SsexSsex CHAR(2),Sage SMALLINT,CHAR(2),Sage SMALLINT,SdeptSdept CHAR(20),PRIMARY KEY(CHAR(20),PRIMARY KEY(SnoSno),),CHECK(CHECK(SsexSsex=女女 OR OR SnameSname NOT LIKE Ms.%)NOT LIKE Ms.%)/*/*定义了元组中定义了元组中SnameSname和和 SsexSsex两个属两个属性值之间的约束条件性值之间的约束条件*/)/)n性别是女性的元组都能通过该项检查;性别是女性的元组都能通过该项检查;n当性别是男性时,则名字一定不能以当性别是男性时,则名字一定不能以Ms.Ms.打打头头,才能通过检查才能通过检查34345.3.4 5.3.4 元组上的约束条件检查和违约处理元组上的约束条件检查和违约处理o插入元组或修改属性的值时,插入元组或修改属性的值时,RDBMSRDBMS检检查元组上的约束条件是否被满足查元组上的约束条件是否被满足o如果不满足则操作被拒绝执行如果不满足则操作被拒绝执行 35355.4 5.4 完整性约束命名子句完整性约束命名子句o完整性约束命名:完整性约束命名:CONSTRAINTCONSTRAINT约束子句约束子句CONSTRAINT CONSTRAINT PRIMARY KEYPRIMARY KEY短语短语|FOREIGN KEY|FOREIGN KEY短语短语|CHECK|CHECK短语短语3636完整性约束命名子句完整性约束命名子句(续续)例例1010建立学生登记表建立学生登记表StudentStudent,要求学号在要求学号在90000-9999990000-99999之间,姓名不能取空值,年龄小之间,姓名不能取空值,年龄小于于3030,性别只能是,性别只能是“男男”或或“女女”。nCREATE TABLE StudentCREATE TABLE Student (SnoSno NUMERIC(6)NUMERIC(6)CONSTRAINT C1 CONSTRAINT C1 CHECK(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 CONSTRAINT C3 CHECK(Sage30)(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四个列级约束。四个列级约束。3737完整性约束命名子句完整性约束命名子句(续续)o修改表中的完整性限制:修改表中的完整性限制:ALTER TABLEALTER TABLE语句语句n增加新的约束条件增加新的约束条件(ADD)(ADD)n修改表中的完整性限制修改表中的完整性限制(DROP-ADD)(DROP-ADD)u先删除原来的约束条件先删除原来的约束条件(DROP)(DROP)u再增加新的约束条件再增加新的约束条件 (ADD)(ADD)n删除表中原有的完整性限制删除表中原有的完整性限制(DROP)(DROP)3838完整性约束命名子句完整性约束命名子句(续续)例例1313修改表修改表StudentStudent中的约束条件,要求学号中的约束条件,要求学号改为在改为在900000-999999900000-999999之间,年龄由小于之间,年龄由小于3030改改为小于为小于4040n可先删除原来的约束条件,再增加新的约束条件可先删除原来的约束条件,再增加新的约束条件 ALTER TABLE Student ALTER TABLE Student DROP CONSTRAINT C1DROP CONSTRAINT C1;ALTER TABLE Student ALTER TABLE Student ADD CONSTRAINT C1ADD CONSTRAINT C1 CHECK(CHECK(SnoSno BETWEEN 900000 AND 999999)BETWEEN 900000 AND 999999),ALTER TABLE Student ALTER TABLE Student DROP CONSTRAINT C3;DROP CONSTRAINT C3;ALTER TABLE Student ALTER TABLE Student ADD CONSTRAINT C3 ADD CONSTRAINT C3 CHECK(Sage40)CHECK(Sage40);3939数据完整性小结数据完整性小结o数据库的完整性是为了保证数据库中存数据库的完整性是为了保证数据库中存储的数据是正确的储的数据是正确的oRDBMSRDBMS完整性实现的机制完整性实现的机制n完整性约束定义机制完整性约束定义机制n完整性检查机制完整性检查机制n违背完整性约束条件时违背完整性约束条件时RDBMSRDBMS应采取的动作应采取的动作4040数据完整性小结数据完整性小结(续)o完整性约束的用途:限制输入到数据库表中的完整性约束的用途:限制输入到数据库表中的值的范围值的范围oSQL ServerSQL Server根据不同用途提供了多种约束根据不同用途提供了多种约束nPRIMARY(PRIMARY(主键主键)约束约束nFOREIGN(FOREIGN(外键外键)约束约束nUNIQUE(UNIQUE(惟一惟一)约束约束nCHECK(CHECK(检查检查)约束约束nNULL(NULL(可否为空可否为空)约束约束nCASCADECASCADE级连引用一致性约束级连引用一致性约束4141数据完整性小结数据完整性小结(续)o当需要在一个表中的多个列上建立约束当需要在一个表中的多个列上建立约束时,只能定义表级约束时,只能定义表级约束o要浏览有关约束的信息可以使用系统存要浏览有关约束的信息可以使用系统存储过程储过程sp_helpconstraintsp_helpconstraint sp_helpconstraintsp_helpconstraint 42425.6 5.6 触发器触发器5.6.1 5.6.1 创建触发器创建触发器 5.6.2 5.6.2 激活触发器激活触发器 5.6.3 5.6.3 删除触发器删除触发器4343触发器触发器(Trigger)(Trigger)o触发器是用户定义在关系表上的一类由触发器是用户定义在关系表上的一类由事件驱动事件驱动的特殊的存储过程的特殊的存储过程n由服务器自动激活由服务器自动激活n可以进行更复杂的检查和操作,具有更精可以进行更复杂的检查和操作,具有更精细和更强大的数据控制能力细和更强大的数据控制能力-不是不是SQLSQL规范的内容,但大多规范的内容,但大多DBMSDBMS都支持都支持 4444触发器触发器(续续)o触发器有助于强制引用完整性触发器有助于强制引用完整性n但强制引用完整性的最好方法是在相关表但强制引用完整性的最好方法是在相关表中定义主键和外键约束中定义主键和外键约束n只要约束和默认值提供了全部所需的功能,只要约束和默认值提供了全部所需的功能,就应使用约束和默认值就应使用约束和默认值4545定义触发器定义触发器oCREATE TRIGGERCREATE TRIGGER语法格式语法格式 CREATE TRIGGER CREATE TRIGGER BEFORE|AFTER BEFORE|AFTER ON ON FOR EACH ROW|STATEMENT FOR EACH ROW|STATEMENT WHEN WHEN 4646创建触发器创建触发器-SQL Server 2000-SQL Server 2000语法格式语法格式oCREATE TRIGGER CREATE TRIGGER ON ON|WITH ENCRYPTION WITH ENCRYPTION FOR|AFTER|INSTEAD OF FOR|AFTER|INSTEAD OF INSERT,UPDATE,DELETE INSERT,UPDATE,DELETE AS AS 4747定义触发器定义触发器(续续)o语法说明语法说明:n创建者:表的创建者:表的拥有者拥有者n触发器名触发器名n表名:触发器的目标表表名:触发器的目标表n触发事件:触发事件:INSERTINSERT、DELETEDELETE、UPDATEUPDATEn触发器类型触发器类型u行级触发器行级触发器(FOR EACH ROW)(FOR EACH ROW)u语句级触发器语句级触发器(FOR EACH STATEMENT)(FOR EACH STATEMENT)4848定义触发器定义触发器(续续)o语法说明语法说明:n触发条件触发条件u触发条件为真触发条件为真u省略省略WHENWHEN触发条件触发条件n触发动作体触发动作体o可以是一个匿名可以是一个匿名SQLSQL过程语句块过程语句块o也可以是对已创建存储过程的调用也可以是对已创建存储过程的调用4949定义触发器定义触发器(续续)o语法说明语法说明:nWITH ENCRYPTIONWITH ENCRYPTION-加密系统分类表加密系统分类表中包含中包含CREATE CREATE TRIGGER TRIGGER 语句文本的条目语句文本的条目5050定义触发器定义触发器(续续)o语句级与行级触发器示例语句级与行级触发器示例n在在TEACHERTEACHER表上创建一个表上创建一个AFTER UPDATEAFTER UPDATE触发器,触发器,若表若表TEACHERTEACHER有有10001000行,执行语句:行,执行语句:UPDATE UPDATE TEACHER SET TEACHER SET DeptnoDeptno=5;=5;u若为语句级触发器,则执行完该语句后,若为语句级触发器,则执行完该语句后,触发动作只发生一次触发动作只发生一次u若为行级触发器,触发动作将执行若为行级触发器,触发动作将执行10001000次次 5151SQL Server2000SQL Server2000触发器类型触发器类型o可使用可使用FORFOR子句指定触发器的执行时间子句指定触发器的执行时间nAFTERAFTER:在触发它们的语句在触发它们的语句(INSERT(INSERT、UPDATEUPDATE、DELETE)DELETE)完成后执行完成后执行-SQL Server 2000-SQL Server 2000中中AFTERAFTER是默认的触发器是默认的触发器nINSTEAD OFINSTEAD OF:用于替代引起触发器执行的用于替代引起触发器执行的SQLSQL语句语句-只能为每个触发操作定义一个只能为每个触发操作定义一个INSTEAD OFINSTEAD OF触发器触发器5252o触发器语句中使用的两个临时的驻留内触发器语句中使用的两个临时的驻留内存的表存的表oSQL Server 2000SQL Server 2000自动创建和治理自动创建和治理o可以使用这两个表测试某些数据修改的可以使用这两个表测试某些数据修改的效果及设置触发器操作的条件效果及设置触发器操作的条件o不能直接对表中的数据进行更改不能直接对表中的数据进行更改 INSERTEDINSERTED表和表和DELETEDDELETED表表5353oINSERTEDINSERTED表表n用于存储用于存储INSERTINSERT和和UPDATEUPDATE语句所影响的行的语句所影响的行的副本副本n在一个插入或更新事务处理中,新建行被同在一个插入或更新事务处理中,新建行被同时添加到时添加到INSERTEDINSERTED表和触发器表中表和触发器表中nINSERTEDINSERTED表中的行是触发器表中新行的副本表中的行是触发器表中新行的副本INSERTEDINSERTED表和表和DELETEDDELETED表表5454oDELETEDDELETED表:表:n用于存储用于存储DELETEDELETE和和UPDATEUPDATE语句所影响的语句所影响的行的复本行的复本n在执行在执行DELETEDELETE或或UPDATE UPDATE 语句时,行从语句时,行从触发器表中删除,并传输到触发器表中删除,并传输到 DELETED DELETED 表中表中nDELETEDELETE表和触发器表通常没有相同的行表和触发器表通常没有相同的行INSERTEDINSERTED表和表和DELETEDDELETED表表5555o插入操作插入操作(INSERT)(INSERT):INSERTEDINSERTED表有数据,表有数据,DELETEDDELETED表无数据表无数据 o删除操作删除操作(DELETE)(DELETE):INSERTEDINSERTED表无数据,表无数据,DELETEDDELETED表有数据表有数据 o更新操作更新操作(UPDATE)(UPDATE):INSERTEDINSERTED表有数据表有数据(新数据新数据),DELETEDDELETED表有数据表有数据(旧数据旧数据)INSERTEDINSERTED表和表和DELETEDDELETED表表5656UPDATEUPDATE触发器的工作过程触发器的工作过程oUPDATEUPDATE触发器的工作过程触发器的工作过程n当在定义了触发器的表上执行当在定义了触发器的表上执行UPDATEUPDATE语句的语句的时候,原