资源简介 (共24张PPT)以程序方式处理学生信息管理数据表任务8-1 SQL编程基础目录Contents任务8-2 创建与使用存储过程任务8-3 触发器任务8-4 事务、锁的概念和应用实训 以程序方式处理数据表的数据任务8-3 触发器PART 3(一)触发器概述(二)创建触发器(三)管理触发器任务assignments触发器任务8-3任务1-1 数据处理【任务分析】为了确保数据的完整性,可以采触发器实现复杂的业务规则。【课堂任务】掌握触发器的概念及应用。 触发器的概念 触发器的创建及管理触发器任务8-3任务1-1 数据处理(一)触发器概述1.触发器的定义触发器(Trigger)是一种特殊的存储过程,它与表紧密相连,可以是表定义的一部分。当预定义的事件(如用户修改指定表或者视图中的数据)发生时,触发器会自动执行。触发器基于一个表创建,但是可以对多个表进行操作。因此触发器可以用来对表实施复杂的完整性约束,当触发器保存的数据改变时,触发器被自动激活,从而防止对数据的不正确修改。触发器的优点如下。触发器任务8-3任务1-1 数据处理(1)触发器自动执行,在对表的数据做了任何修改(如手工输入或者使用程序采集的操作)之后立即激活。(2)触发器可以通过数据库中的相关表进行层叠更改。这比直接把代码写在前台的做法更安全合理。(3)触发器可以强制限制,这些限制比用CHECK约束定义的更复杂。与CHECK约束不同的是,触发器可以引用其他表中的列。触发器任务8-3任务1-1 数据处理2.触发器的分类在SQL Server系统中,按照触发事件的不同,可以把提供的触发器分成两大类型,即DDL触发器和DML触发器。(1)DML触发器DML 触发器为特殊类型的存储过程,可在发生数据操作语言(DML)事件时自动生效,以便影响触发器中定义的表或视图。DML事件包括 INSERT、UPDATE或DELETE语句。DML触发器可用于强制业务规则和数据完整性、查询其他表并包括复杂的 Transact-SQL语句。将触发器和触发它的语句作为可在触发器内回滚的单个事务对待。如果检测到错误(如磁盘空间不足),则整个事务自动回滚。(2)DDL触发器DDL触发器将激发响应各种数据定义语言(DDL)事件。这些事件主要与以关键字CREATE、ALTER、DROP、GRANT、DENY、REVOKE或UPDATE STATISTICS开头的Transact-SQL语句对应。触发器任务8-3任务1-1 数据处理(二)创建触发器1.DML触发器因为DML触发器是一种特殊的存储过程,所以DML触发器的创建和存储过程的创建方式有很多相似之处,创建DML触发器的基本语法如下。CREATE TRIGGER trigger_nameON {table|view}{{{FOR|AFTER|INSTEAD OF}{[UPDATE [[,][INSERT][,][DELETE] ]ASsql_statement}}触发器任务8-3任务1-1 数据处理CREATETRIGGER语句中,主要参数的含义如下。trigger_name:是要创建的触发器的名称。table|view:是在其上执行触发器的表或者视图,有时称为触发器表或者触发器视图。可以选择是否指定表或者视图的所有者。FOR、AFTER、INSTEAD OF:指定触发器触发的时机。AFTER:指定触发器只有在SQL语句中指定的所有操作都已成功执行后才触发,只有在所有的引用级联操作和约束检查成功完成后,才能执行此触发器。如果仅指定FOR关键字,则AFTER是默认设置。触发器任务8-3任务1-1 数据处理INSTEAD OF:指定执行触发器而不是执行触发的SQL语句,从而替代触发语句的操作。在表或视图上,每个INSERT、UPDATE或DELETE语句最多可以定义一个INSTEAD OF触发器。DELETE、INSERT、UPDATE:指定在表或视图上执行哪些语句时将触发触发器的关键字。必须至少指定一个选项。在触发器定义中允许使用以任意顺序组合的这些关键字。如果指定的选项多于一个,需用逗号分隔这些选项。sql_statement:指定触发器执行的Transact-SQL语句。触发器任务8-3任务1-1 数据处理【例8.27】 在grademanager数据库中,创建名称为“trig_更新班级人数”的触发器。当向student表添加一条学生信息时,同时更新class表中的classnumber列。创建一个INSERT触发器,在用户每次向student表添加新的学生信息时,更新相应班级的人数。USE grademanagerGOCREATE TRIGGER trig_更新班级人数ON studentAFTER INSERTASUPDATE class SET classnumber=classnumber+1WHERE classnoIN(SELECT left(sno,8) FROM inserted)GO触发器任务8-3任务1-1 数据处理执行上面的语句,就创建了一个“trig_更新班级人数”触发器。接下来,使用INSERT语句插入一条新的学生信息,以验证触发器是否会自动执行。这里由于触发器基于student表,因此插入也针对此表,在INSERT语句之前之后各添加一条SELECT语句,比较插入记录前后处理状态的变化。测试语句如图8.10所示。从图8.10中可以看到,执行INSERT语句后,班级人数已经更改,比执行INSERT语句前多1,说明INSERT触发器已经成功执行。触发器任务8-3任务1-1 数据处理触发器任务8-3任务1-1 数据处理触发器任务8-3任务1-1 数据处理【例8.29】 创建一个触发器,当class表中的班级编号变更时,同时更新student表中的相应班级编号信息。USE grademanagerGOCREATETRIGGERtrig_班级信息更新ON classFOR UPDATEASIF UPDATE(classno)BEGINUPDATE student SET classno=(SELECT classno FROM inserted)WHERE classnoIN(SELECT classno FROM deleted)END触发器任务8-3任务1-1 数据处理【例8.30】 创建一个触发器,用于在grademanager数据库中删除student表的一个学生信息时,级联删除该学生对应sc表中的成绩信息。默认时,由于student表和sc表在sno列上存在外键约束,因此不允许直接删除student表中的内容。创建一个INSTRAD OF DELETE触发器,在检测到有DELETE语句执行时,先删除外键表sc中对应的信息,再删除student表中的内容。具体代码如下触发器任务8-3任务1-1 数据处理USE grademanagerGOCREATE TRIGGER trig_DELETEON studentINSTEAD OF DELETEASBEGINDELETE sc WHERE snoIN(SELECT sno FROM deleted)DELETE student WHERE snoIN(SELECT sno FROM deleted)END触发器任务8-3任务1-1 数据处理2.DDL触发器DDL触发器和DML触发器一样,为了响应事件而激活。创建DDL触发器的语法格式如下。CREATE TRIGGER trigger_nameON {ALL SERVER|DATABASE}WITH ENCRYPTION{FOR|AFTER|{enent_type}AS sql_statement触发器任务8-3任务1-1 数据处理(1)ALL SERVER:表示DDL触发器的作用域是整个服务器。(2)DATABASE:表示该DDL触发器的作用域是整个数据库。(3)event_type:指定触发DDL触发器的事件。如果想要控制哪位用户可以修改数据库结构及如何修改,甚至想跟踪数据库结构上发生的修改,那么使用DDL触发器非常合适。例如,重要数据库内部的结构及其数据都很重要,不能轻易删除或者改变,即便能改动,也要在改动之前做好备份,以免丢失重要数据。为此,可以创建一个DDL触发器来防止删除或者改变数据库这样的操作发生。触发器任务8-3任务1-1 数据处理触发器任务8-3任务1-1 数据处理(三)管理触发器1.修改触发器修改触发器的定义和属性有两种方法:一是先删除原来的触发器定义,再重新创建与之同名的触发器;二是直接修改现有的触发器定义。【例8.32】 将上述的DDL触发器“trig_DDL_学生信息”修改成只保护ALTER TABLE语句。USE grademanagerGOALTER TRIGGER trig_DDL_学生信息ON DATABASEFOR ALTER_TABLEASBEGINPRINT '不能修改当前数据库的内容!'ROLLBACKEND在【新建查询】窗口中执行上述语句,就修改了以前的触发器定义触发器任务8-3任务1-1 数据处理2.禁用触发器在修改表的ALTER TABLE语句中,使用DISABLE TRIGGER子句可以使该表的某一触发器无效。当再次需要时,可以使用ALTER TABLE语句的ENABLE TRIGGER子句使触发器重新有效。例如,使student表的“trig_更新班级人数”触发器无效,可以使用如下语句。USE grademanagerGOALTER TABLE studentDISABLE TRIGGER trig_更新班级人数触发器任务8-3任务1-1 数据处理使“trig_更新班级人数”触发器再次有效可以使用下面的语句。ALTER TABLE studentENABLE TRIGGER trig_更新班级人数3.删除触发器使用DROP TRIGGER语句可以删除当前数据库的一个或者多个触发器。【例8.33】 删除触发器“trig_更新班级人数”和“trig_班级信息更新”。USE grademanagerGODROP TRIGGER trig_更新班级人数,trig_班级信息更新 展开更多...... 收起↑ 资源预览