第11章 触发器

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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

相关文档
最新文档