暴难的问题 请教高手
两个地位相等的表 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。