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

解决方案 »

  1.   

    在各自的处罚器中写个判断.如果存在某条记录则不插入.例如: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
      

  2.   

    同意..dawugui(潇洒老乌龟) 看法。
      

  3.   

    那就不让造成"无限递归":  表  A,B都加个字段 Res
    你自己增加数据时Res为1
    触发器增加数据时Res为0写触发器时判定一下
    新增的临时表中Res是否为0 
    为0跳出
    不为0再新增
      

  4.   

    设置 server 的 trigger recursion 选项为0
      

  5.   

    http://blog.csdn.net/zjcxc/archive/2007/08/05/1726711.aspx
    这里有全面的解决方案
      

  6.   

    联机丛书中的
    ==
    触发器不会以递归方式自行调用,除非设置了 RECURSIVE_TRIGGERS 数据库选项。有两种不同的递归方式: 直接递归 
    即触发器激发并执行一个操作,而该操作又使同一个触发器再次激发。例如,一应用程序更新了表 T3,从而引发触发器 Trig3。Trig3 再次更新表 T3,使触发器 Trig3 再次被引发。间接递归 
    即触发器激发并执行一个操作,而该操作又激发了同一个表或另一个表中的某个触发器。第二个触发器的执行再次引发第一个触发器的操作。例如,某应用程序更新了表 T1,并引发触发器 Trig1。Trig1 更新表 T2,从而引发了触发器 Trig2 。Trig2 转而更新表 T1,从而再次引发 Trig1。当将 RECURSIVE_TRIGGERS 数据库选项设置为 OFF 时,仅防止直接递归。若要也禁用间接递归,请将 nested triggers 服务器选项设置为 0。
      

  7.   

    我自己也想到一种方法:用视图来实现 但是比较复杂
    最后 发现
    qiuming0306() 提供的网页上 的最后一种方法最直观且简单揭帖