1、2022-11-111数据库系统概论数据库系统概论An Introduction to Database System第五章第五章 数据库完整性数据库完整性第五章第五章 数据库完整性数据库完整性什么是数据库的完整性什么是数据库的完整性1)数据的正确性和相容性)数据的正确性和相容性2)防止不合语义的数据进入数据库。)防止不合语义的数据进入数据库。例例:学生的年龄必须是整数,取值范围为学生的年龄必须是整数,取值范围为14-29;学生的性别只能是男或女;学生的性别只能是男或女;学生的学号一定是唯一的;学生的学号一定是唯一的;学生所在的系必须是学校开设的系;学生所在的系必须是学校开设的系;3)完整性:
2、是否真实地反映现实世界)完整性:是否真实地反映现实世界完整性控制机制完整性控制机制1.完整性约束条件定义机制完整性约束条件定义机制2.完整性检查机制完整性检查机制一般在一般在INSERT,UPDATE,DELETE执行后开执行后开始检查,也可以在事务提交时检查。始检查,也可以在事务提交时检查。3.违约处理违约处理 拒绝或级联执行等。拒绝或级联执行等。第五章第五章 数据库完整性数据库完整性5.1 实体完整性实体完整性5.2 参照完整性参照完整性5.3 用户定义的完整性用户定义的完整性5.4 完整性约束命名子句完整性约束命名子句5.6 触发器触发器5.7 小结小结5.1实体完整性实体完整性 5.1
3、.1实体完整性定义实体完整性定义 PRIMARY KEY定义定义,表级完整性约束或列级完表级完整性约束或列级完整性约束整性约束 5.1.2实体完整性检查和违约实体完整性检查和违约处理处理 每当用户程序对基本表插入一条记录或者对主码列进行更新操作时,按照实体完整性规则,系统将进行检查:主主码值是否码值是否唯一,如果不唯一则拒绝插入或修改唯一,如果不唯一则拒绝插入或修改 主主码各属性是否为码各属性是否为空,只要有一个为空就拒绝插入或修改空,只要有一个为空就拒绝插入或修改方法:全表扫描或者索引查找(一般在主码上自动建立一个索引)5.2参照完整性参照完整性 5.2.1参照完整性定义参照完整性定义 创建
4、表时创建表时,FOREIGN KEY定义定义 5.2.2参照完整性检查和违约处理参照完整性检查和违约处理 以以SC和和S为例为例,四种情况四种情况:SC中增加一个元组,而在student中找不到相应的元组 修改SC中的一个元组 从student删除一个元组 修改student中的一个元组5.2.2 参照完整性检查和违约处理参照完整性检查和违约处理 当上述的不一致发生时,系统可以采用以下的策略:当上述的不一致发生时,系统可以采用以下的策略:1 拒绝(拒绝(No Action)执行)执行 不允许该操作执行。该策略一般设置为默认策略。2 级联(级联(Cascade)操作)操作 当删除或修改被参照表(
5、Student)的一个元组造成了与参照表(SC)的不一致,则删除或修改参照表中的所有造成不一致的元组。例如:删除Student表中的元组,Sno的值为200215121,则从要SC表中级联删除SC.Sno=200215121的所有元组。5.2.2 参照完整性检查和违约处理参照完整性检查和违约处理 设置为空值设置为空值 当删除或修改被参照表的一个元组时造成了不一致,则将参照表中的所有造成不一致的元组对应属性设置为空值。例:5.2.2 参照完整性检查和违约处理参照完整性检查和违约处理因此,对于参照完整性,除了应该定义外码,因此,对于参照完整性,除了应该定义外码,还应定义外码列是否允许空值。还应定义
6、外码列是否允许空值。一般,当对参照表和被参照表的操作违反了参一般,当对参照表和被参照表的操作违反了参照完整性,系统选用默认策略,即拒绝执行。如果照完整性,系统选用默认策略,即拒绝执行。如果想让系统采用其他的策略则必须想让系统采用其他的策略则必须在创建表的时候显在创建表的时候显示地加以说明示地加以说明。显示说明参照完整性的违约处理显示说明参照完整性的违约处理 ON DELETE NO ACTION|CASCADE|SET NULL|SET DEFAULT ON UPDATE NO ACTION|CASCADE|SET NULL|SET DEFAULT 5.3用户定义的完整性用户定义的完整性 5.
7、3.1属性上的约束条件的定义属性上的约束条件的定义 列值非空(列值非空(Not Null);列值唯一(列值唯一(Unique);检查列值是否满足布尔表达式(检查列值是否满足布尔表达式(CHECK););5.3.2属性上的约束条件检查和违约处理属性上的约束条件检查和违约处理 当往表中插入元组或修改属性的值时,检查属性上的约束是否被满足,如果不满足则操作被拒绝执行。5.3.3元组上的约束条件的定义元组上的约束条件的定义 CHECK短语(短语(同属性值限制相比,元组级的限制可以设置不同属性之间的取值的相互约束条件)5.3.4元组上的约束条件检查和违约处理元组上的约束条件检查和违约处理 当往表中插入元
8、组或修改属性的值时,检查属性上的约束是否被满足,如果不满足则操作被拒绝执行。5.3用户定义的完整性用户定义的完整性5.3用户定义的完整性用户定义的完整性5.6触发器触发器触发器的基础知识 触发器触发器是一种特殊的存储过程,是是一种特殊的存储过程,是SQL SQL ServerServer为保证数据完整性、确保系统正常工为保证数据完整性、确保系统正常工作而设置的一种高级技术。触发器在特定的作而设置的一种高级技术。触发器在特定的表上定义,该表也称为触发器表。当触发器表上定义,该表也称为触发器表。当触发器所保护的数据发生变化时,触发器就会自动所保护的数据发生变化时,触发器就会自动运行,以保证数据的完
9、整性与正确性。运行,以保证数据的完整性与正确性。1.1.触发器有如下作用:触发器有如下作用:1 1)可以对数据库进行级联修改。)可以对数据库进行级联修改。2 2)可以完成比)可以完成比CHECKCHECK更复杂的约束。与更复杂的约束。与CHECKCHECK约束不约束不 同,在触发器中可以引用其他的表。同,在触发器中可以引用其他的表。3 3)根据改变前后表中不同的数据进行相应的操作。)根据改变前后表中不同的数据进行相应的操作。4 4)对于一个表上的不同的操作)对于一个表上的不同的操作(INSERT(INSERT、UPDATEUPDATE或或 DELETEDELETE)可以采用不同的触发器,即使是
10、对相同的)可以采用不同的触发器,即使是对相同的 语句也可以调用不同的触发器完成不同的操作。语句也可以调用不同的触发器完成不同的操作。在创建数据表时,已经定义了各字段的类型及在创建数据表时,已经定义了各字段的类型及其他约束条件,比如主键、外键关系其他约束条件,比如主键、外键关系等。这些作为等。这些作为预选过滤,在数据写入数据库之前就会被校验,只预选过滤,在数据写入数据库之前就会被校验,只有当这些校验全都通过后,触发器才会执行。有当这些校验全都通过后,触发器才会执行。如果如果前面的这些校验没有全部通过,触发器就不会执行。前面的这些校验没有全部通过,触发器就不会执行。因为触发器是在操作之后才执行。因
11、为触发器是在操作之后才执行。2.2.触发器具有以下特点:触发器具有以下特点:1 1)它是在操作有效后才执行的,即其他约束优先于)它是在操作有效后才执行的,即其他约束优先于 触发器。触发器。2 2)它与存储过程的不同之处在于存储过程可以由用)它与存储过程的不同之处在于存储过程可以由用 户直接调用,而触发器不能被直接调用,是由事户直接调用,而触发器不能被直接调用,是由事 件触发的。件触发的。3 3)一个表可以有多个触发器,在不同表上同一种类)一个表可以有多个触发器,在不同表上同一种类 型的触发器也可以有多个。型的触发器也可以有多个。4 4)触发器允许嵌套,最多为)触发器允许嵌套,最多为3232层。
12、层。5 5)触发器可以提高对表及表行有级联操作的应用程)触发器可以提高对表及表行有级联操作的应用程 序的性能。序的性能。触发器定义之后,其名称存储于sysobjects表中,定义语句存储在syscomments表中。定义触发器的Transact-SQL语句中不能出现以下语句,否则SQL Server将拒绝编译、存储这些语句相关的触发器。所有的CREATE命令 所有的DROP命令 ALTER TABLE和ALTER DATABASE命令 TRUNCATE TABLE命令(删除表中所有行)GRANT和REVOKE命令 UPDATE STATISTICS命令 SELECT INTO命令等。(创建表将
13、结果集填充)在创建触发器时,还要遵循以下原则:(1)触发器的定义必须是批处理的第一条 命令。(2)触发器只能在表上定义。(3)触发器不能处理TEXT和IMAGE数据类型的 大型二进制对象表列。(4)建议不要使用触发器返回一个结果集。3.3.触发器的类型触发器的类型 在在SQL Server 2008SQL Server 2008中,根据激活触发器执行中,根据激活触发器执行的的T-SQLT-SQL语句类型,可以把触发器分为两类:语句类型,可以把触发器分为两类:DMLDML触发器触发器 当 数 据 库 服 务 器 中 发 生 数 据 操 作 语 言(D a t a Manipulation Lan
14、guage)事件(Insert,Update,Delete)时执行的存储过程。DDLDDL触发器触发器 响应数据定义语言(Data Definition Language)事件(Create,Alter,Drop)时执行的存储过程。DML触发器触发器 DML触发器根据引起触发时间的不同可分为触发器根据引起触发时间的不同可分为After触发器(后触发器)触发器(后触发器)和和Instead Of触触发器(替代触发器)发器(替代触发器)After触发器(后触发器)触发器(后触发器)在记录已经改变完后(执行完insert,update或delete和处理完约束后)才被激活执行,主要用于记录变更后的处
15、理或检查,一旦发现错误,也可以用Rollback Transaction语句来回滚本次操作。Instead Of触发器(替代触发器触发器(替代触发器)用来取代原本要进行的操作,在记录变更之前发生的,不执行原来SQL语句里的操作,而是代替insert,update,delete语句去执行触发器本身所定义的操作。DML触发器触发器 DML触发器与表和视图是不能分开的,触发触发器与表和视图是不能分开的,触发器定义在表和视图中,当表或视图中执行器定义在表和视图中,当表或视图中执行insert,update,delete操作时触发器被触发操作时触发器被触发并自动执行。并自动执行。当表或视图被删除时与它关
16、联的触发器也一当表或视图被删除时与它关联的触发器也一同被删除。同被删除。一个表或视图可以定义多个一个表或视图可以定义多个After触发器,触发器,一个表或视图只可以定义一个一个表或视图只可以定义一个Instead触发触发器。器。创建创建DMLDML触发器的触发器的语法格式为语法格式为:CREATE TRIGGER CREATE TRIGGER 触发器名触发器名 ON ON 表名或视图名表名或视图名 FOR|AFTER|INSTEAD OF FOR|AFTER|INSTEAD OF DELETE,INSERT,UPDATE DELETE,INSERT,UPDATE AS AS SQL SQL语句
17、语句 nn 注:不能在视图或临时表上建立触发器,但是在触发注:不能在视图或临时表上建立触发器,但是在触发器定义中可以引用视图或临时表。当触发器引用视图器定义中可以引用视图或临时表。当触发器引用视图或临时表时,产生两个特殊的表:或临时表时,产生两个特殊的表:deleteddeleted表和表和insertedinserted表表。这两个表的结构总与激活触发器的表的。这两个表的结构总与激活触发器的表的结构相同,触发器执行完成后,与该触发器相关的这结构相同,触发器执行完成后,与该触发器相关的这两个临时表也会被自动删除。用户可以用两个临时表也会被自动删除。用户可以用SELECTSELECT语句语句查询
18、临时表的内容,但不能对它们进行修改。查询临时表的内容,但不能对它们进行修改。可以用可以用于触发器的条件测试于触发器的条件测试。例:对例:对stjustju库中库中s s表的表的DELETEDELETE操作定义触发器。操作定义触发器。USE stju GO IF EXISTS(SELECT name FROM sysobjects WHERE name=reader_d AND type=TR)DROP TRIGGER reader_d GO CREATE TRIGGER reader_d CREATE TRIGGER reader_d ON s ON s FOR DELETE FOR DELE
19、TE AS AS PRINT PRINT 数据被删除!数据被删除!GOINSERT触发器和DELETE触发器 当向表中插入数据时,所有数据约束都通过之后,INSERT触发器就会执行。新的记录不但加到触发器表中,而且还会有副本加入insertedinserted表中。同样,DELETE触发器会将删除的内容保存在deleteddeleted表中。INSERTED表与DELETED表一样,它们的记录是可读的,可以进行比较,以便确认这些数据是否正确。UPDATE触发器 利用UPDATE修改一条记录时,相当于删除一条记录然后再增加一条新记录。所以UPDATE操作使用insertedinserted和de
20、leteddeleted两个表。当使用UPDATE操作时,触发器表中原来的记录被移到deleteddeleted表中,修改过的记录插入到insertedinserted表中,触发器可以检查这两个表,以便确定应执行什么样的操作。例例1 例:创建触发器例:创建触发器“T_学生删除学生删除”,从,从“学生学生”表中删除数据时,相应地从表中删除数据时,相应地从“成绩成绩”表中表中删除数据。删除数据。Create trigger T_学生删除学生删除On 学生学生After deleteAsDelete 成绩成绩Where 学生编号学生编号=(select 学生编号学生编号 from deleted)例
21、例2 例:创建触发器例:创建触发器“T_教师添加教师添加”,向,向“辅导辅导员员”表中添加数据时,相应地向表中添加数据时,相应地向“教师教师”表表中添加数据。中添加数据。Create trigger T_教师添加教师添加On 辅导员辅导员After insertAsInsert 教师(编号,姓名,出生年月)教师(编号,姓名,出生年月)Select 编号,姓名,出生年月编号,姓名,出生年月 from inserted例例3 例:创建触发器例:创建触发器“T_教师修改教师修改”,向,向“辅导辅导员员”表中修改表中修改“姓名姓名”列时,相应地修改列时,相应地修改“教师教师”表中的对应数据。表中的对应
22、数据。Create trigger T_教师修改教师修改On 辅导员辅导员After updateAsIf update(姓名姓名)Begin Update 教师教师Set 姓名姓名=(select 姓名姓名 from inserted)Where 编号编号=(select 编号编号 from deleted)End 局部变量局部变量 局部变量是用户自定义的变量。使用范围是定义它的批、局部变量是用户自定义的变量。使用范围是定义它的批、存储过程或触发器。存储过程或触发器。局部变量前面通常加上局部变量前面通常加上 标记标记。DECLARE DECLARE 定义局部变量定义局部变量,并指明此变量的数
23、据类型,并指明此变量的数据类型SETSET或或SELECTSELECT命令对其赋值命令对其赋值。局部变量的数据类型可以是。局部变量的数据类型可以是用户自定义的数据类型,也可以是系统数据类型,但不能用户自定义的数据类型,也可以是系统数据类型,但不能将其定义为将其定义为TEXTTEXT或或IMAGEIMAGE数据类型。数据类型。定义局部变量的语法如下定义局部变量的语法如下:DECLARE local_variable data_type DECLARE local_variable data_type ,local_variable data_type ,local_variable data_t
24、ype DECLAREDECLARE命令可以定义多个局部变量,之间用逗号分隔命令可以定义多个局部变量,之间用逗号分隔。局部变量与全局变量局部变量与全局变量 用用SELECTSELECT为局部变量赋值的语法如下:为局部变量赋值的语法如下:SELECT variable_name=expression select statement ,variable_name=expression select statement FROM list of tables WHERE expression GROUP BY.HAVING.ORDER BY说明:说明:(1)SELECT(1)SELECT命令可以将
25、一个表达式的值赋给一个局部变量,命令可以将一个表达式的值赋给一个局部变量,也可以将一个也可以将一个SELECTSELECT查询的结果赋给一个局部变量。查询的结果赋给一个局部变量。(2)SELECT(2)SELECT命令通常返回一个值给局部变量。当返回多个值,命令通常返回一个值给局部变量。当返回多个值,则变量的值为最后一个返回值则变量的值为最后一个返回值。【例4】多个返回值的赋值。多个返回值的赋值。DECLARE varl varchar(8)SELECT varl=学生姓名学生姓名 SELECT varl=sname FROM s Select varl AS 学生姓名学生姓名 执行结果为:学
26、生姓名学生姓名 -返回返回最后一名最后一名学生的姓名(注意顺序)学生的姓名(注意顺序)【例例5 5】DECLARE var1 varchar(8)-声明局部变量声明局部变量SELECT var1=学生姓名学生姓名 -为局部变量赋初值为局部变量赋初值Print var1 -显示局部变量结果显示局部变量结果SELECT var1=snameFROM sWHERE sno=200215121SELECT var1 AS 学生姓名学生姓名 用用SETSET为局部变量赋值为局部变量赋值 用用SETSET为局部变量赋值的常用语法格式为:为局部变量赋值的常用语法格式为:SET local_variable=
27、expressionSET local_variable=expression 【例6】使用SET命令赋值的变量。USE stjuUSE stju GO GO DECLARE no varchar(10)DECLARE no varchar(10)SET no=SET no=200215122200215122 SELECT sno,sname SELECT sno,sname FROM s FROM s WHERE sno=no WHERE sno=no GO GO 执行结果为:执行结果为:snosno snamesname -200215122 200215122 李亚茜李亚茜全局变量全局
28、变量 全局变量是一组特殊的函数,他们的名全局变量是一组特殊的函数,他们的名称以称以开头,而且不需要任何参数,在调开头,而且不需要任何参数,在调用时也无需在函数名后面加上一对(),这用时也无需在函数名后面加上一对(),这些函数又称为些函数又称为“无参函数无参函数”使用全局变量时请注意以下规则:使用全局变量时请注意以下规则:1)1)全局变量是由全局变量是由SQL ServerSQL Server系统提供并赋值的,系统提供并赋值的,是在服务器级定义的变量。用户不能建立全局变是在服务器级定义的变量。用户不能建立全局变量,也不能用量,也不能用SETSET语句修改全局变量的值。但语句修改全局变量的值。但可
29、可以将全局变量的值赋给局部变量,以便保存和处以将全局变量的值赋给局部变量,以便保存和处理理。2)2)用户只能使用系统预定义的全局变量。用户只能使用系统预定义的全局变量。3)3)引用全局变量时,前面一定加上引用全局变量时,前面一定加上标记。标记。4)4)用户不能定义与系统全局变量同名的局部变量,用户不能定义与系统全局变量同名的局部变量,否则将产生不可预测的结果。否则将产生不可预测的结果。例如:例如:ERROR 保存最近执行操作的错误状态,即返保存最近执行操作的错误状态,即返回最后一次执行回最后一次执行SQL语句的错误代码;语句的错误代码;MAX_CONNECTIONS返回返回SQL Server
30、上允上允许用户同时连接的最大数;许用户同时连接的最大数;CONNECTIONS返回返回SQL Server最近一次启最近一次启动后连接或尝试连接的次数。动后连接或尝试连接的次数。ROWCOUNT,是返回最近一次数据库操作所,是返回最近一次数据库操作所涉及到的行数。涉及到的行数。【例例7 7】使用全局变量使用全局变量ROWCOUNTROWCOUNT,查询命令,查询命令 影响的行数。影响的行数。UPDATE Readers UPDATE Readers SET SET 已借数量已借数量=2=2 SELECT ROWCOUNT AS SELECT ROWCOUNT AS 行数行数 GOGO 执行结果
31、为 行数行数 5 5例例8 例:在例:在“成绩成绩”上创建触发器,检查插入的上创建触发器,检查插入的成绩是否在成绩是否在0到到100之间。之间。Create trigger check_成绩成绩On 成绩成绩For insert,updateAsDeclare score intSelect score=成绩成绩 from insertedIf score100Begin Print 成绩必须在成绩必须在0到到100之间!之间!RollbackEnd例例9 在在“学生学生”表中创建触发器,当有人试图修表中创建触发器,当有人试图修改学生表中的数据时,利用下述触发器可以改学生表中的数据时,利用下述
32、触发器可以跳过修改数据的跳过修改数据的SQL语句(防止数据被修改语句(防止数据被修改),并向客户端显示提示信息。),并向客户端显示提示信息。Create trigger T_学生学生_updateOn 学生学生Instead of updateAsBegin raiserror(对不起,学生表的数据不允许修改对不起,学生表的数据不允许修改,16,10)End (考虑:如何用考虑:如何用after触发器改写?触发器改写?)例例10Create trigger T_学生学生_update2After updateAsBegin print 对不起,学生表的数据不允许修改对不起,学生表的数据不允许修
33、改 RollbackEnd ReadersReaders(读者编号读者编号,读者类型,姓名,单位,已借图书数量),读者类型,姓名,单位,已借图书数量)BooksBooks(图书编号图书编号,数量,出版社名),数量,出版社名)borrowinfborrowinf(读者编号,图书编号,借书日期读者编号,图书编号,借书日期,还书日期),还书日期)当在表当在表borrowinfborrowinf中插入借阅信息记录时,得到该书的应还日期。中插入借阅信息记录时,得到该书的应还日期。CREATE TRIGGER T_return_dateCREATE TRIGGER T_return_date ON bor
34、rowinf ON borrowinf for INSERT for INSERT AS AS DECLARE type varchar(8)DECLARE type varchar(8)SELECT type=SELECT type=读者类型读者类型 FROM readersFROM readers WHERE WHERE 编号编号=(select=(select 读者编号读者编号 from INSERTED)from INSERTED)update borrowinf set update borrowinf set 还书日期还书日期=getdate()+=getdate()+case c
35、ase when type=3 then 45 when type=3 then 45 when type=2 then 60 when type=2 then 60 when type=1 then 90 when type=1 then 90 end end where where 读者编号读者编号=(select=(select 读者编号读者编号 from INSERTED)from INSERTED)例例11 触发器创建之后,用户执行一条命令触发器创建之后,用户执行一条命令:insert into borrowinf(读者编号读者编号,图书编号图书编号)values(200406000
36、2,F33.33)CREATE TRIGGER s_d ON sc FOR DELETE AS DECLARE data_yj int SELECT data_yj=grade FROM deleted IF data_yj0 begin PRINT 成绩为+RTRIM(data_yj)rollback end ELSE PRINT 该学生选课记录已被删除!触发器创建之后,用户执行一条命令触发器创建之后,用户执行一条命令:DELETE sc WHERE sno=200215125 例例122022-11-112022-11-11 长春理工大学计算机科学技术学院长春理工大学计算机科学技术学院 下
37、面那条命令能使数据库数据发生变化下面那条命令能使数据库数据发生变化()USE CollegeMIS GO CREATE TRIGGER Update_Teacher ON Teacher FOR UPDATE AS IF UPDATE(TeaID)BEGIN PRINT 不能修改教师的身份证号不能修改教师的身份证号 ROLLBACK TRANSACTION END GO 下面程序执行结果(下面程序执行结果()USE CollegeMIS GO CREATE TRIGGER Delete_Teacher ON Teacher FOR DELETE AS ROLLBACK TRANSACTION
38、GO DELETE FROM Teacher WHERE age60 GO SELECT*FROM Teacher WHERE age602022-11-112022-11-11 长春理工大学计算机科学技术学院长春理工大学计算机科学技术学院例1:在 market 数据库中建立一个名为del_goods的 DELETE 触发器,存储在goods表中。当用户删除goods表中的某些货品时,这些货品在orders表中的定单全部删除,以实现goods表和orders表的级联删除。第一步:创建触发器 USE market GO CREATE TRIGGER del_goods ON goods AFTE
39、R DELETE AS DELETE orders WHERE 货品名称 IN (SELECT 货品名称 FROM DELETED)GO实验题目:实验题目:第二步:检验触发器的作用DELETE goods WHERE 货品名称=penIF NOT EXISTS(SELECT*FROM Orders WHERE 货品名称=pen)PRINT 相关记录已从orders表中删除掉!例2:在market 数据库中创建一个名为ins_orders 的 INSERT 触发器,存储在orders表中,当向表orders中插入一条记录时,检查该定单中的货品是否正在整理中(查看对应货品在goods表中的状态是否
40、为1),如果是在整理中,则不能下定单(该记录不能插入goods表中)。第一步:创建触发器USE marketGOCREATE TRIGGER ins_orders ON orders AFTER INSERT AS DECLARE x char(20),y bit SELECT x=货品名称 FROM insertedSELECT y=状态 FROM goods WHERE 货品名称=xIF y=1 BEGIN PRINT(本货品正在整理中,现在不能下定单)ROLLBACK TRANSACTION ENDGO 第二步:检验触发器的作用INSERT orders(货品名称,客户编号,数量)VAL
41、UES(desk,2,5)SELECT*FROM orders WHERE 货品名称=desk 例3:创建触发器,当向CJB表中插入一个学生的成绩时,将XSB表中该学生的总学分加上添加的课程的学分。Create trigger cjb_insertOn cjbAfter insertAs Begin declare num char(6),kc_num char(3)Declare xf intSelect num=学号,kc_num=课程号 from insertedSelect xf=学分 from kcb where 课程号=kc_numUpdate xsb set 总学分=总学分+xf
42、 where 学号=numPrint 修改成功End 例4:向XSCP表插入或修改一记录时,通过触发器检查记录CPBH字段的值在CP表是否存在,如不存在,则取消插入或修改操作 if exists(select name from sysobjects where xtype=TR and name=xscp_tri)drop trigger xscp_triGoCreate trigger xscp_tri on dbo.xscpfor insertAsBegin if(select cpbh from inserted)not in(select cpbh from cp)rollbackE
43、nd 禁用禁用DMLDML触发器:触发器:Alter table 数据表名Disable trigger 触发器名|ALL(如果要禁用所有触发器,用ALL代替触发器名)启用启用DMLDML触发器:触发器:Alter table 数据表名Enable trigger 触发器名|ALL删除删除DMLDML触发器:触发器:Drop trigger 触发器名查看查看DMLDML触发器:触发器:sp_help 触发器名或sp_helptext 触发器名DDL触发器触发器 格式:格式:Create trigger 触发器名触发器名on all server|databasefor|afterAsSQL语句语句DDL触发器触发器 例:建立用于保护例:建立用于保护“实例数据库实例数据库”中的数据中的数据表不被删除的触发器。表不被删除的触发器。Use 实例数据库实例数据库Create trigger T_禁止删除表禁止删除表On databaseFor drop_tableAsBegin print 对不起,表不允许删除!对不起,表不允许删除!rollbackEnd