两个地位相等的表 A,B
要求:
在 A中插入一条记录 就必同时在B中也生成一条对应的记录
反之 B中插入 同样 也在A中生成一条记录
初次的想法是 双方各自建立一个触发器。但是这样就造成"无限递归":
假设在A中插入一条记录于是A的insert触发器激活
A中的触发器用insert into B 会使得B中的触发器 激活并使用 insert into A
而 insert into A 又激活A的触发器 调用insert into B ......如此无限循环
要求:
在 A中插入一条记录 就必同时在B中也生成一条对应的记录
反之 B中插入 同样 也在A中生成一条记录
初次的想法是 双方各自建立一个触发器。但是这样就造成"无限递归":
假设在A中插入一条记录于是A的insert触发器激活
A中的触发器用insert into B 会使得B中的触发器 激活并使用 insert into A
而 insert into A 又激活A的触发器 调用insert into B ......如此无限循环
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
你自己增加数据时Res为1
触发器增加数据时Res为0写触发器时判定一下
新增的临时表中Res是否为0
为0跳出
不为0再新增
这里有全面的解决方案
==
触发器不会以递归方式自行调用,除非设置了 RECURSIVE_TRIGGERS 数据库选项。有两种不同的递归方式: 直接递归
即触发器激发并执行一个操作,而该操作又使同一个触发器再次激发。例如,一应用程序更新了表 T3,从而引发触发器 Trig3。Trig3 再次更新表 T3,使触发器 Trig3 再次被引发。间接递归
即触发器激发并执行一个操作,而该操作又激发了同一个表或另一个表中的某个触发器。第二个触发器的执行再次引发第一个触发器的操作。例如,某应用程序更新了表 T1,并引发触发器 Trig1。Trig1 更新表 T2,从而引发了触发器 Trig2 。Trig2 转而更新表 T1,从而再次引发 Trig1。当将 RECURSIVE_TRIGGERS 数据库选项设置为 OFF 时,仅防止直接递归。若要也禁用间接递归,请将 nested triggers 服务器选项设置为 0。
最后 发现
qiuming0306() 提供的网页上 的最后一种方法最直观且简单揭帖