两张表A,B
结构完全一样,初始数据也完全一样
做一个触发器,使得更新A的同时,也更新B,我写的触发器是这样的
(假设A所有字段为:ID,t1,t2,t3,……,t9)
create trigger tr_A_update 
on A 
for update 
as 
delete B where exists(select * FROM deleted where B.ID =deleted.ID )
insert into B (ID,t1,t2,t3,t4,t5,t6,t7,t8,t9)
select ID,t1,t2,t3,t4,t5,t6,t7,t8,t9
from inserted 
但这里存在一个问题,就是,若B有改动之后,对A进行UPDATE操作,触发器会把B改动之后的数据覆盖掉。
打个比方,初始状态的时候,A和B中的数据都是(0,1,2,3,4,5,6,7,8,9),首先我对B进行UPDATE,把B变成了(0,1,1,1,1,5,6,7,8,9),接着,我又对A进行UPDATE,把A变成了(0,1,2,3,4,1,1,1,1,1),本来是希望触发器把B变成(0,1,1,1,1,1,1,1,1,1)的,但是现在触发器把B变成了(0,1,2,3,4,1,1,1,1,1),不是原来所想,请问怎么做这个触发器呢?

解决方案 »

  1.   

    是吗,那么简单一点,其实就是希望触发器的触发只影响A更新过的字段,
    也就是说create trigger tr_A_update 
    on A 
    for update 
    as 
    if update(t1)
    begin
     update B set B.t1=i.t1 
    from inserted as i join deleted as d on (i.ID=d.id)
    where B.ID=d.id and 
    end……这是我更改后的触发器,但是如果有9个字段的话,那么就要写9次上面的begin……end语句块,我嫌麻烦,请问有简洁一点的方法吗?
      

  2.   

    回2楼,表结构就是
    ID,t1,t2,t3,……,t9
    十个字段
    主键是ID
      

  3.   

    又对A进行UPDATE,把A变成了(0,1,2,3,4,1,1,1,1,1),本来是希望触发器把B变成(0,1,1,1,1,1,1,1,1,1)的,但是现在触发器把B变成了(0,1,2,3,4,1,1,1,1,1),不是原来所想,请问怎么做这个触发器呢? 
    你的触发器的意思本来就是这样啊
      

  4.   

    回5楼,我本来写的触发器的确是这样,但希望的效果不是这样,希望的效果是只UPDATE更新过的字段
      

  5.   

    那肯定得用IF UPDATE 来判断
      

  6.   

    A和B中的数据都是(0,1,2,3,4,5,6,7,8,9),首先我对B进行UPDATE,把B变成了(0,1,1,1,1,5,6,7,8,9),接着,我又对A进行UPDATE,把A变成了(0,1,2,3,4,1,1,1,1,1),
    --------------
    第二次已经将t1,t2,t3,t4改成1了。怎么后面又改回去了。
    改回去了。当然B表也需要跟着改了。。
      

  7.   

    create trigger tr_A_update 
    on A 
    for update 
    as 
    delete B where exists(select * FROM deleted where B.ID =deleted.ID ) 
    insert into B (ID,t1,t2,t3,t4,t5,t6,t7,t8,t9) 
    select ID,t1,t2,t3,t4,t5,t6,t7,t8,t9 
    from inserted 
    你原先的这个语句有什么问题?
      

  8.   


    因为A中还是(0,1,2,3,4,5,6,7,8,9),对A的操作是只UPDATE后5个
      

  9.   

    问题就是,本来只希望A更新了那几个字段,B也只是更新哪几个字段,用我原来的做,
    如果B更改过了,但是,A更新了的话,会覆盖B更改过的值,这是不希望见到的
      

  10.   

    哦,你相当于要把A、B表的数据进行一个双向同步
    那你这个地方有没想过这样一个问题,当A、B表同时更改一个字段的时候,结果应该以谁为准?
      

  11.   

    不会同时更新,有先后顺序,更新A某几个字段的同时只更新B相应的字段,更新B不会影响A
      

  12.   

    ⊙﹏⊙b
    那100个字段岂不是要写100个次?原来的触发器肯定存在有问题,它会覆盖B更改过的值,就算不同时更新一条数据
    就好像原来
    A:                                 B:
    ID,t1,t2,t3,t4,t5,t6,t7,t8,t9  ID,t1,t2,t3,t4,t5,t6,t7,t8,t9
    0 ,1 ,2 ,3 ,4 ,5 ,6 ,7 ,8 ,9   0 ,1 ,2 ,3 ,4 ,5 ,6 ,7 ,8 ,9更新BA:                                 B:
    ID,t1,t2,t3,t4,t5,t6,t7,t8,t9  ID,t1,t2,t3,t4,t5,t6,t7,t8,t9
    0 ,1 ,2 ,3 ,4 ,5 ,6 ,7 ,8 ,9   0 ,1 ,1 ,1 ,1 ,5 ,6 ,7 ,8 ,9更新A(这里我只更新最后一个字段)A:                                 B:
    ID,t1,t2,t3,t4,t5,t6,t7,t8,t9  ID,t1,t2,t3,t4,t5,t6,t7,t8,t9
    0 ,1 ,2 ,3 ,4 ,5 ,6 ,7 ,8 ,0   0 ,1 ,2 ,3 ,4 ,5 ,6 ,7 ,8 ,0它把B之前更改的覆盖掉了,这是不希望见到的不知道能不能用columns_updated()来简化