我给我用的管理软件写了个第三方小程序,需要用触发器将管理软件SQL表中的一些数据和第三方小程序同步一样,但是用了触发器后,管理软件一操作SQL表就提示:“无法为更新定位行。一些值可能已在最后一次读取后更改”,这个时候去查看SQL表,数据已经更新,我就想不让管理软件在操作更新SQL的时候出现上述提示,除了用触发器外,还有什么别的办法可以让两表同步么?触发器代码:CREATE TRIGGER TRI_GZ ON GP_GZ_XXB
FOR INSERT,DELETE,UPDATE
AS
BEGIN
  DELETE VK_GZ 
    FROM VK_GZ 
    WHERE EXISTS(SELECT 1 FROM DELETED D WHERE D.GZ_BH=VK_GZ.GZ_BH)
  UPDATE VK_GZ 
    SET GZ_MC=I.GZ_MC,GZ_DZ=I.GZ_DZ,GZ_MM=I.GZ_MM,SCBS=I.SCBS 
    FROM VK_GZ,INSERTED I 
    WHERE VK_GZ.GZ_BH=I.GZ_BH
  INSERT VK_GZ 
    SELECT GZ_BH,GZ_MC,GZ_DZ,GZ_MM,SCBS 
  FROM INSERTED I 
    WHERE NOT EXISTS(SELECT 1 FROM VK_GZ WHERE I.GZ_BH=VK_GZ.GZ_BH)
END

解决方案 »

  1.   

    你的代码先是删除,然后update删除的数据,这个不可能的啊。
    这里的update没有意义。
      

  2.   

    把update 那一句删掉,应该就不会提示了 呵呵
    测试了一下sql 2008 没有这个提示,不知道2000 有没有。
      

  3.   


    update  那一句是多余的 和前面的delete 矛盾了 
      

  4.   


    他们的管理系统是DELPHI做的,我也不清楚是怎么绑定的我的是VFP6.0做的,连的SQL做的主要是他们的管理系统在添加、修改、删除数据的时候,在我给他们的SQL表用了触发器后,他们的管理系统就会提示
      

  5.   

    你的FOR INSERT,DELETE,UPDATE本身也是有問題的,新增是deleted表不存在的,刪除時inserted表不存在的,update時兩表才同時存在的,所以你應該分開寫insert,update,delete觸發器
    不過這不是本問題的關鍵,程序才是關鍵
      

  6.   

    不好意思,我試了下,新增時deleted表是存在的,暈
      

  7.   


    这个触发器我在SQL 2000测试的无错、完全可以执行的