我有一个访问 SQL Server 后端的 MS Access 前端数据库。当不复制 SQL Server 数据库时,这(据我们所知)可以完美运行。一旦我们引入了复制(使用合并复制从作为发布者的适当服务器上的 SQL Server Standard 到作为订阅者的笔记本电脑上的 SQL Server Express),我们开始出现我无法解释的奇怪的数据库损坏。
发生的情况是我们有针对数据库中多个表运行的 UPDATE 查询,并且我们还有 Access 本身也对多个表执行 CRUD 操作(这种损坏不仅限于一个表)。我们看到的结果是随机(大约十分之一的操作)更新了我们想要更新的行以外的一行,这覆盖了我们不想覆盖的数据。
设置后,复制会作为拉式合并在笔记本电脑上按需运行,无论是否执行复制,都会发生损坏。它只需要启用。未启用复制时似乎没有发生损坏。
我在这里并不是在指责微软有任何过错——这完全有可能是我忘记勾选某些方框以防止这种情况发生。我只是不确定我需要寻找什么。
编辑:我所说的腐败是这样的:假设我有行:
ID | FirstName | LastName
--------------------------
1 | John | Smith
2 | Emma | Citizen
3 | Bob | May
然后我按照以下方式运行:
UPDATE Table SET FirstName = "Test" WHERE ID = 1
在那之后我得到了这个:
ID | FirstName | LastName
--------------------------
1 | Test | Smith
2 | Test | Citizen
3 | Bob | May
处理复制的任何系统表中都没有错误消息。架构中的唯一变化是,当启用复制时,它会创建 rowguid 列。
因此,事实证明(经过数小时的尝试诊断)我确实遇到了由启用合并复制引起的问题,而不是我认为的问题。为了将来参考,这里是发生了什么......
我有一个用 VBA 编写的 DAO 查询,如下所示:
问题是
rs.Move 0, rs.LastModified
行,它移动到最近更新的行(刚刚插入的行),然后下一行检索新的主键。这有多个问题:基本上,这段代码适用于单用户数据库(这是它的起源),但不适用于多用户场景。
解决方案(目前)与此类似,使用刚刚插入的所有值手动检索正确的行:
这还有其他潜在问题(如果您有两行具有完全相同的数据,您可能会得到错误的主键 ID)但在这种情况下,对于此表,这不是问题。