第11章 触发器
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
触 发 器
11.1 练习题11及参考答案
1.什么是触发器?其主要功能是什么?
答:触发器是一种实施复杂数据完整性的特殊存储过程,在对表或视图执行UPDATE 、INSERT 或DELETE 语句时自动触发执行,以防止对数据进行不正确、未授权或不一致的修改。
触发器主要用于保持数据完整性、检查数据有效性、实现数据库管理任务和一些附加的功能。
2.触发器分为哪几种?
答:触发器分为DML 和DDL 触发器:
• DML 触发器:是在执行数据操作语言事件时被调用的触发器,其中数据操作语言
事件包括:INSERT 、UPDATE 和DELETE 语句。触发器中可以包含复杂的T-SQL 语句,触发器整体被看作一个事务,可以进行回滚。
• DDL 触发器:它也是一种特殊的存储过程,由相应的事件触发后执行。与DML
不同的是,它相应的触发事件是由数据定义语言引起的事件,包括CREATE 、ALTER 和DROP 语句。DDL 触发器用于执行数据库管理任务,如调节和审计数据库运转。DDL 触发器只能在触发事件发生后才会调用执行,即它只能是AFTER 类型的。
3. INSERT 触发器、UPDA TE 触发器和DELETE 触发器有什么不同?
答:它们的主要区别是触发的事件不同,INSERT 触发器由INSERT 操作所触发执行;UPDA TE 触发器由UPDA TE 操作所触发执行;DELETE 触发器由DELETE 操作所触发执行。
4. AFTER 触发器和INSTEAD OF 触发器有什么不同?
答:两者的区别如下:
• AFTER 触发器:在执行了INSERT 、UPDATE 或DELETE 语句操作之后执行
第 章
11
AFTER触发器。指定AFTER与指定FOR相同,它是SQL Server早期版本中唯一可用的选项。AFTER触发器只能在表上指定。一个表可以有多个AFTER触发器•INSTEAD OF触发器:执行INSTEAD OF触发器代替通常的触发动作。还可为带有一个或多个基表的视图定义INSTEAD OF触发器,而这些触发器能够扩展视图可支持的更新类型。一个表只能具有一个给定类型的INSTEAD OF触发器。
5. 创建DML触发器时需指定哪些项?
答:创建DML触发器时需指定的项有:
•名称。
•定义触发器时所基于的表。
•触发器被触发的时间。
•激活触发器的数据修改语句。有效选项为INSERT、UPDATE或DELETE。多个数据修改语句可激活同一个触发器。例如,触发器可由INSERT或UPDATE语句激活。
•执行触发器操作的编程语句。
11.2 上机实验题10及操作过程
在上机实验题9的factory数据库上,使用T-SQL语句完成如下各题:
(1)在表depart上创建一个触发器depart_update,当更改部门号时同步更改worker 表中对应的部门号。
(2)在表worker上创建一个触发器worker_delete,当删除职工记录时同步删除salary 表中对应职工的工资记录。
(3)删除触发器depart_update。
(4)删除触发器worker_delete。
操作过程
(1)建立触发器depart_update的程序如下::
USE factory
GO
IF EXISTS (SELECT name FROM sysobjects
WHERE type='TR' AND name='depart_update')
DROP TRIGGER depart_update
GO
CREATE TRIGGER depart_update ON depart
FOR UPDATE
AS
DECLARE @olddepno int,@newdepno int
SELECT @olddepno=部门号 FROM deleted
SELECT @newdepno=部门号 FROM inserted
UPDATE worker
SET 部门号=@newdepno
WHERE 部门号=@olddepno
GO
执行下列语句,可验证存储过程的正确性:
USE factory
GO
PRINT '将部门号101改为105'
UPDATE depart
SET 部门号=105
WHERE 部门号=101
GO
SELECT 职工号,姓名,部门号 FROM worker GO
PRINT '将部门号105改为101'
UPDATE depart
SET 部门号=101
WHERE 部门号=105
GO
SELECT 职工号,姓名,部门号 FROM worker GO
执行结果如下:
将部门号101改为105
职工号姓名部门号
---------- ---------- -----------
1 孙华 105
10 陈涛 102
11 刘欣 105
12 李涵 103
13 王小燕 105
14 李艺 103
15 魏君 103
2 孙天奇 102
3 陈明 102
4 李华 103
5 余慧 103
6 欧阳少兵 103
7 程西 105
8 张旗 102
9 刘夫文 102
将部门号105改为101
职工号姓名部门号
---------- ---------- -----------
1 孙华 101
10 陈涛 102
11 刘欣 101