我给我用的管理软件写了个第三方小程序,需要用触发器将管理软件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
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
这里的update没有意义。
测试了一下sql 2008 没有这个提示,不知道2000 有没有。
update 那一句是多余的 和前面的delete 矛盾了
他们的管理系统是DELPHI做的,我也不清楚是怎么绑定的我的是VFP6.0做的,连的SQL做的主要是他们的管理系统在添加、修改、删除数据的时候,在我给他们的SQL表用了触发器后,他们的管理系统就会提示
不過這不是本問題的關鍵,程序才是關鍵
这个触发器我在SQL 2000测试的无错、完全可以执行的