任务8-3 触发器 课件(共24张PPT)-《数据库应用技术-SQL Server》同步教学(人民邮电版)

资源下载
  1. 二一教育资源

任务8-3 触发器 课件(共24张PPT)-《数据库应用技术-SQL Server》同步教学(人民邮电版)

资源简介

(共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_name
ON {table|view}
{
{{FOR|AFTER|INSTEAD OF}
{[UPDATE [[,][INSERT][,][DELETE] ]
AS
sql_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 grademanager
GO
CREATE TRIGGER trig_更新班级人数
ON student
AFTER INSERT
AS
UPDATE class SET classnumber=classnumber+1
WHERE 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 grademanager
GO
CREATETRIGGERtrig_班级信息更新
ON class
FOR UPDATE
AS
IF UPDATE(classno)
BEGIN
UPDATE 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 grademanager
GO
CREATE TRIGGER trig_DELETE
ON student
INSTEAD OF DELETE
AS
BEGIN
DELETE 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_name
ON {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 grademanager
GO
ALTER TRIGGER trig_DDL_学生信息
ON DATABASE
FOR ALTER_TABLE
AS
BEGIN
PRINT '不能修改当前数据库的内容!'
ROLLBACK
END
在【新建查询】窗口中执行上述语句,就修改了以前的触发器定义
触发器
任务8-3
任务1-1 数据处理
2.禁用触发器
在修改表的ALTER TABLE语句中,使用DISABLE TRIGGER子句可以使该表的某一触发器无效。当再次需要时,可以使用ALTER TABLE语句的ENABLE TRIGGER子句使触发器重新有效。
例如,使student表的“trig_更新班级人数”触发器无效,可以使用如下语句。
USE grademanager
GO
ALTER TABLE student
DISABLE TRIGGER trig_更新班级人数
触发器
任务8-3
任务1-1 数据处理
使“trig_更新班级人数”触发器再次有效可以使用下面的语句。
ALTER TABLE student
ENABLE TRIGGER trig_更新班级人数
3.删除触发器
使用DROP TRIGGER语句可以删除当前数据库的一个或者多个触发器。
【例8.33】 删除触发器“trig_更新班级人数”和“trig_班级信息更新”。
USE grademanager
GO
DROP TRIGGER trig_更新班级人数,trig_班级信息更新

展开更多......

收起↑

资源预览