日期:2014-05-18  浏览次数:20378 次

暴难的问题 请教高手
两个地位相等的表     A,B    
 
要求:    
在     A中插入一条记录     就必同时在B中也生成一条对应的记录    
反之     B中插入     同样     也在A中生成一条记录    
 
 
初次的想法是     双方各自建立一个触发器。但是这样就造成 "无限递归 ":    
 
假设在A中插入一条记录于是A的insert触发器激活
A中的触发器用insert     into     B     会使得B中的触发器     激活并使用     insert     into     A        
而     insert     into     A     又激活A的触发器     调用insert     into     B     ......如此无限循环

------解决方案--------------------
在各自的处罚器中写个判断.如果存在某条记录则不插入.

例如:

create trigger my_trig on a for insert
as
if not exists (select ....)
insert into ...
go


create trigger my_trig on a for insert
as
insert into b select * from a where id not in (select id from b)
go
------解决方案--------------------
那就不让造成 "无限递归 ": 表 A,B都加个字段 Remarks
你自己增加数据时Remarks为1
触发器增加数据时Remarks为0

写触发器时判定一下
新增的临时表中Remarks是否为0
为0跳出
不为0再新增

------解决方案--------------------
设置 server 的 trigger recursion 选项为0
------解决方案--------------------
http://blog.csdn.net/zjcxc/archive/2007/08/05/1726711.aspx
这里有全面的解决方案
------解决方案--------------------
联机丛书中的
==
触发器不会以递归方式自行调用,除非设置了 RECURSIVE_TRIGGERS 数据库选项。有两种不同的递归方式:

直接递归
即触发器激发并执行一个操作,而该操作又使同一个触发器再次激发。例如,一应用程序更新了表 T3,从而引发触发器 Trig3。Trig3 再次更新表 T3,使触发器 Trig3 再次被引发。

间接递归
即触发器激发并执行一个操作,而该操作又激发了同一个表或另一个表中的某个触发器。第二个触发器的执行再次引发第一个触发器的操作。例如,某应用程序更新了表 T1,并引发触发器 Trig1。Trig1 更新表 T2,从而引发了触发器 Trig2 。Trig2 转而更新表 T1,从而再次引发 Trig1。

当将 RECURSIVE_TRIGGERS 数据库选项设置为 OFF 时,仅防止直接递归。若要也禁用间接递归,请将 nested triggers 服务器选项设置为 0。