REATE TRIGGER tr_test
ON dbo.a 
FOR UPDATE
AS
BEGIN
    delete b where b.a in(select a from deleted)
    insert into b select * from inserted
END
GO

解决方案 »

  1.   

    REATE TRIGGER tr_test
    ON dbo.a 
    FOR UPDATE
    AS
    update b set a = (select top 1 a from inserted)
    where b.a = (select top 1 a from deleted)
      

  2.   

    谢谢libin_ftsafe(子陌红尘)
    我并不是要这种效果的,我只是想知道,如果我要更新的列是主键,而且可能会影响多行,如何在触发器中获取某一行更新前的值和对应的更新后的值.把上面的例子附加条件,b表的b列和a表的a值相同道德b列值不同,请教该如何处理?
      

  3.   

    你更新表a 的列a,那么在 临时表deleted和临时表 inserted 中的a值应该分别相等,用 top 1 不就可以取到值了吗
      

  4.   

    因为你的主键要更新,多以你需要有一个其他的字段来唯一标识一行,比如identity列:CREATE TRIGGER tr_test
    ON dbo.a 
    FOR UPDATE
    AS
    update b set a=I.a
    from b 
    join deleted D on D.a=b.a
    join inserted I on D.唯一标识列=I.唯一标识列
    go
      

  5.   

    比较好的办法是在b.a上定义外键引用a.a
      

  6.   

    to phantomMan(全力转向 .net 和 数据库方向):
    按你那种模式必须要保证deleted inserted中同次序的列互相对应,而且好像要用游标逐条更新,不知道是不是这样,当然也非常感谢你的建议,我想知道有没有其它办法
      

  7.   

    CREATE TRIGGER tr_test
    ON dbo.a 
    FOR UPDATE
    AS
        UPDATE b
        SET 
            a = e.new_a
        FROM
            b,
            (select 
                 distinct new_a = i.a,old_a = b.a 
             from 
                 inserted i,deleted d
             where
                 i.b = d.b) e
        where
            b.a = e.old_a
    GO