数据库系统原理与应用第九讲上节课的回顾索引视图数据库完整性存储过程第十五章触发器15.1概述15.2创建DML触发器15.3inserted表和deleted表15.4使用DML触发器15.5创建和使用DDL触发器15.6触发器的管理15.1概述触发器是一种特殊类型的存储过程,它在插入、删除或修改指定表中的数据时触发执行。使用触发器可大大增强应用程序的健壮性、数据库的可恢复性和可管理性。SQLServer2005提供2类触发器:DML触发器:在执行数据操纵语言(insert、update、delete)时被调用触发。DDL触发器:其用于执行数据库管理任务,由相应的事件触发后执行,包括create、alter、drop语句。15.2创建DML触发器1.使用SQLServer管理控制器创建15.2创建DML触发器2.使用T-SQL语句创建DML触发器CREATETRIGGER触发器名ON{表名|视图名}[WITHENCRYPTION]{{{FOR|AFTER|INSTEADOF}{[INSERT][,][UPDATE][,][DELETE]}[WITHAPPEND][NOTFORREPLICATION]AS[{IFUPDATE(column)[{AND|OR}UPDATE(column)][…n]|IF(COLUMNS_UPDATED(){bitwise_operator}updated_bitmask){comparison_operator}column_bitmask[…n]}]sql_statement[…n]}}加密在指定操作成功后激发指定执行触发器兼容低版本用复制进程更改表时不执行该触发器触发器的条件和操作测试在指定的列上进行INSERT或DELETE操作测试是否插入或更新了提及的列15.2创建DML触发器例在数据库school中创建触发器trigop,在student表中添加、修改和删除记录时自动显示表中记录15.3inserted表和deleted表在触发器执行时,会产生两个临时表,它们结构和触发器所在的表结构相同:inserted表用于存储INSERT和UPDATE语句所影响的行的副本,在执行上面语句时,新建行被同时添加到inserted表和触发器表中。deleted表用于存储DELETE和UPDATE语句所影响行的副本,在执行上面语句时,行从触发器表中删除,传输到deleted表中。15.3inserted表和deleted表例编写一段T-SQL语句说明inserted表和deleted表的作用15.4使用DML触发器1.使用INSERT触发器INSERT触发器常用来更新时间标记字段,或验证被触发器监控的字段中数据满足要求的标准,以确保数据的完整性。当向数据库中插入数据时,该触发器将被触发执行。15.4使用DML触发器例:建立触发器trigname,当向student表中插入数据时,如果出现姓名重复,则回滚事务。运行结果:15.4使用DML触发器例:建立触发器trigsex,当向student表中插入数据时,如果出现性别不正确,则提示错误信息。运行结果:15.4使用DML触发器2.使用UPDATE触发器当一个有UPDATE触发器的表修改数据时,表中原来的记录被移到deleted表中,修改过的记录插入到inserted表。15.4使用DML触发器例:建立修改触发器trigno,防止用户修改student表的学号。运行结果:15.4使用DML触发器例:建立触发器trigcopy,把student表中所有被修改的数据保存到studentdup表中作为历史数据。运行结果:15.4使用DML触发器3.使用DELETE触发器当DELETE触发器被触发时,表中原来的记录被移到deleted表中。该触发器常用于为防止删除一些不能删除的数据和实现数据表级联操作。15.4使用DML触发器例:建立删除触发器trigclass,防止用户删除表student中所有95031班的学生。运行结果:15.4使用DML触发器例:建立触发器trigcopy1,把student表中所有被删除的数据保存到studentdup表中作为历史数据。运行结果:15.4使用DML触发器4.使用INSTEADOF触发器INSTEADOF触发器用来代替通常的触发动作,即当对表进行INSERT、UPDATE或DELETE操作时,系统不是直接对表执行这些操作,而是把操作内容交给触发器,让触发器检查所进行的操作是否正确。如正确才进行相应的操作。因此,INSTEADOF触发器的动作要早于表的约束处理。15.4使用DML触发器例:建立触发器trigname1,当向student表中插入数据时,如果出现姓名重复,则回滚事务。运行结果:15.5创建和使用DDL触发器DDL触发器是响应数据定义语句操作,一般用来防止对数据库结构的更改、或希望数据库中发生某种情况来响应数据库结构的更改、以及记录数据库结构中的更改或事件。15.5创建和使用DDL触发器1.创建DDL触发器CREATETRIGGER触发器名ON{ALLSERVER|DATABASE}{FOR|AFTER}{event_type|event_group}[,…n]ASsql_statement15.5创建和使用DDL触发器2.DDL触发器的应用例:在school数据库上创建一DDL触发器safedbf,用来防止该数据库中的任一表被修改或删除。运行结果:15.6触发器的管理1.查看触发器利用SQLServer管理控制器15.6触发器的管理利用系统存储过程查看触发器1)查看一般信息:sp_help触发器名称2)查看触发器正文:sp_helptext触发器名称3)查看触发器引用的表:sp_depends触发器名称15.6触发器的管理2.修改触发器利用SQLServer管理控制器使用ALTERTRIGGER语句3.删除触发器利用SQLServer管理控制器使用DROPTRIGGER语句15.6触发器的管理4.启用或禁用触发器利用SQLServer管理控制器使用ALTERTABLE语句ALTERTABLE表名{ENABLE|DISABLE}TRIGGER触发器名上机练习514.编写一个程序交叉表查询的程序,生成下图的成绩大表查询。解题思路:利用游标和临时表来完成.1.按学生表中的学号和姓名生成一个临时表2.按选课表中的课程号,分别对临时表增加字段3.按选课表中的每一条记录,分别修改临时表特定学生的特定课程成绩相关SQL命令:自学要求与上课安排●上机内容:完成上机实习:做完上机练习7的第八部分。●在3.7前上交期末小节