使用嵌套触发器
如果一个触发器在执行操作时引发了另一个触发器,而这个触发器又接着引发下一个触发器……这些触发器就是嵌套触发器。触发器可嵌套至 32 层,并且可以控制是否可以通过"嵌套触发器"服务器配置选项进行触发器嵌套。
如果允许使用嵌套触发器,且链中的一个触发器开始一个无限循环,则超出嵌套级,而且触发器将终止。
可使用嵌套触发器执行一些有用的日常工作,如保存前一触发器所影响行的一个备份。例如,可以在 titleauthor 上创建一个触发器,以保存由 delcascadetrig 触发器所删除的 titleauthor 行的备份。在使用 delcascadetrig 时,从 titles 中删除title_id PS2091 将删除 titleauthor 中相应的一行或多行。要保存数据,可在 titleauthor 上创建 DELETE 触发器,该触发器的作用是将被删除的数据保存到另一个单独创建的名为 del_save 表中。例如:
CREATE TRIGGER savedel
ON titleauthor
FOR DELETE
AS
INSERT del_save
SELECT * FROM deleted
不推荐按依赖于顺序的序列使用嵌套触发器。应使用单独的触发器层叠数据修改。
说明 由于触发器在事务中执行,如果在一系列嵌套触发器的任意层中发生错误,则整个事务都将取消,且所有的数据修改都将回滚。在触发器中包含 PRINT 语句,用以确定错误发生的位置。
递归触发器
触发器不会以递归方式自行调用,除非设置了 RECURSIVE_TRIGGERS 数据库选项。有两种不同的递归方式:
直接递归
即触发器激发并执行一个操作,而该操作又使同一个触发器再次激发。例如,一应用程序更新了表 T3,从而引发触发器 Trig3。Trig3 再次更新表 T3,使触发器 Trig3 再次被引发。
间接递归
即触发器激发并执行一个操作,而该操作又使另一个表中的某个触发器激发。第二个触发器使原始表得到更新,从而再次引发第一个触发器。例如,一应用程序更新了表 T1,并引发触发器 Trig1。Trig1 更新表 T2,从而使触发器 Trig2 被引发。Trig2 转而更新表 T1,从而使 Trig1 再次被引发。
当将 RECURSIVE_TRIGGERS 数据库选项设置为 OFF 时,仅防止直接递归。若要也禁用间接递归,请将 nested triggers 服务器选项设置为 0。
示例
A. 使用递归触发器解决自引用关系
递归触发器的一种用法是用于带有自引用关系的表(亦称为传递闭包)。例如,表 emp_mgr 定义了:
一个公司的雇员 (emp)。
每个雇员的经理 (mgr)。
组织树中向每个经理汇报的雇员总数 (NoOfReports)。
递归 UPDATE 触发器在插入新雇员记录的情况下可以使 NoOfReports 列保持最新。INSERT 触发器更新经理记录的 NoOfReports 列,而该操作递归更新管理层向上其它记录的 NoOfReports 列。
USE pubs
GO
-- Turn recursive triggers ON in the database.
ALTER DATABASE pubs
SET RECURSIVE_TRIGGERS ON
GO
CREATE TABLE emp_mgr (
emp char(30) PRIMARY KEY,
mgr char(30) NULL FOREIGN KEY REFERENCES emp_mgr(emp),
NoOfReports int DEFAULT 0
)
GO
CREATE TRIGGER emp_mgrins ON emp_mgr
FOR INSERT
AS
DECLARE @e char(30), @m char(30)
DECLARE c1 CURSOR FOR
SELECT emp_mgr.emp
FROM emp_mgr, inserted
WHERE emp_mgr.emp = inserted.mgr
OPEN c1
FETCH NEXT FROM c1 INTO @e
WHILE @@fetch_status = 0
BEGIN
UPDATE emp_mgr
SET emp_mgr.NoOfReports = emp_mgr.NoOfReports + 1 -- Add 1 for newly
WHERE emp_mgr.emp = @e -- added employee.
FETCH NEXT FROM c1 INTO @e
END
CLOSE c1
DEALLOCATE c1
GO
-- This recursive UPDATE trigger works assuming:
-- 1. Only singleton updates on emp_mgr.
-- 2. No inserts in the middle of the org tree.
CREATE TRIGGER emp_mgrupd ON emp_mgr FOR UPDATE
AS
IF UPDATE (mgr)
BEGIN
UPDATE emp_mgr
SET emp_mgr.NoOfReports = emp_mgr.NoOfReports + 1 -- Increment mgr's
FROM inserted -- (no. of reports) by
WHERE emp_mgr.emp = inserted.mgr -- 1 for the new report.
UPDATE emp_mgr
SET emp_mgr.NoOfReports = emp_mgr.NoOfReports - 1 -- Decrement mgr's
FROM deleted -- (no. of reports) by 1
WHERE emp_mgr.emp = deleted.mgr -- for the new report.
END
GO
-- Insert some test data rows.
INSERT emp_mgr(emp, mgr) &#118alueS ('Harry', NULL)
INSERT emp_mgr(emp, mgr) &#118alueS ('Alice', 'Harry')
INSERT emp_mgr(emp, mgr) &#118alueS ('Paul', 'Alice')
INSERT emp_mgr(emp, mgr) &#118alueS ('Joe', 'Alice')
INSERT emp_mgr(emp, mgr) &#118alueS ('Dave', 'Joe')
GO
SELECT * FROM emp_mgr
GO
-- Change Dave's manager from Joe to Harry
UPDATE emp_mgr SET mgr = 'Harry'
WHERE emp = 'Dave'
GO
SELECT * FROM emp_mgr
GO
以下是更新前的结果:
emp mgr NoOfReports
------------------------------ ----------------------------- -----------
Alice Harry 2
Dave Joe 0
Harry NULL 1
Joe Alice 1
Paul Alice 0
以下为更新后的结果:
emp mgr NoOfReports
------------------------------ ----------------------------- -----------
Alice Harry 2
Dave Harry 0
Harry NULL 2
Joe Alice 0
Paul Alice 0
SQL Server 数据库技术之:使用嵌套触发器
作者:本站原创转载自:xin3721网络学院更新时间:2010/10/19
- 视频教程在线观看
- Access二级视频教程
- 李天生SQL2008数据库视频教程
- 李天生二级VF考试视频教程
- MYSQL教程:MySQL命令导数据的实际
- MySQL教程之使用MySQL管理心得讲述
- MySQL教程之MySQL常用命令大汇总
- MySQL教程之MySQL到ORACLE程序迁移
- MySQL教程之MySQL 操作日志查看的实
- MySQL教程之MySQL 资源的正确应用
- MySQL教程之MySQL使用备忘的实际操
- MySQL教程之重置MySQL数据库密码的
- MySQL教程之MySQL基本语法的列举
- MySQL教程之对MySQL全文索引限制的
- MySQL教程之MySQL数据库运行、访问
- MySQL教程之MySQL数据库密码忘记的
- MySQL教程之MySQL数据库备份守则和
- MySQL教程之MySQL基本操作
- SQL教程:用DTS实现SQL数据库的导入
- SQL教程:root密码丢失
- SQL教程:SQL Server口令密码对照表
- SQL常用命令使用方法
- win7下成功安装sql server 2000(图
- Oracle数据查询技巧:使用连接符显
- SQL 视频教Sql server分页的总结
- SQL Server数据库技术之:DTS(上)
- SQL Server技术之:触发器编程细节
- SQL Server 数据库技术之:用触发器
- SQL Server 数据库技术之:DTS(中)
- SQL Server 数据库技术之:使用嵌套
- SQL Server 数据库技术之:Drop Al
- SQL Server 数据库技术之:Drop Al
- SQL Server 数据库技术之:CreateT
- SQL Server 数据库技术之:Get Tri
- SQL教程:DTS包属性(1)
- SQL Server数据库技术之:DTS包属性
- SQL Server 数据库技术之:DTS(下)
- SQL Server 数据库技术之:触发器
- 浅谈数据库设计技巧(上)
- SQL教程:存储过程
- SQLSERVER扩展存储过程XP_CMDSHELL
- 跟我学SQL:(二) SELECT语句选项
- SQL Server 2000企业版安装教程
- 多线程下不重复读取SQL Server的数
- 如何使用数据库引擎优化顾问优化数
- TFS2008SP1, 升级数据库从SQL2005S
- 解决t400,win7,VM虚拟机的ping不
- win7下使用sql管理器连接sql serve
- SQL Server 2008 R2十大新特性解析
- 自动输出SQL Server对象依赖列表到
- Sql server数据库密码安全追踪和存
- 数据库组件 Hxj.Data
- Oracle PL/SQL入门之案例实践
- 跟我学SQL:(一)数据查询
- 新手入门 Windows下Oracle安装图解
- SQL Server 2000安装和基本框架
- 详解SQL Server的版本区别及选择
- 数据库菜鸟不可不看 简单SQL语句小
- SQL教程:微软SQL介绍2
- SQL教程:微软SQL介绍
- Oracle教程:Oracle中数据库使用及
- SQL教程微软SQL介绍3
- SQL教程:微软SQL介绍4
- SQL教程微软SQL介绍5