无法编辑/删除SQL Server链接至MS Access的表行,报错多用户同时编辑
以下是排除已知原因后的可能问题及排查方向:
主键列数据异常:
虽已设置整数主键,仍需确认SQL Server端主键列无重复值、无NULL。执行以下SQL检查:SELECT 主键列名, COUNT(*) AS 重复次数 FROM 问题表名 GROUP BY 主键列名 HAVING COUNT(*) > 1;若存在重复,需先清理数据(删除重复行或调整主键)——主键约束本应阻止重复,但如果是事后添加主键时未处理历史数据,可能导致索引异常,引发Access误判。
ODBC驱动版本不兼容:
旧版Jet ODBC驱动对SQL Server 2008 R2的支持有限,建议更换为SQL Server Native Client 10.0或更高版本(如ODBC Driver 11 for SQL Server):- 在ODBC数据源管理器中删除旧DSN,重新创建使用新驱动的DSN;
- 删除Access中的链接表,用新DSN重新链接。
缺少rowversion/timestamp列:
Access默认依赖SQL Server的rowversion(旧称timestamp)列进行乐观并发检测,若表无此列,Access会用所有列值对比,一旦有隐性数据修改(如SQL Server端自动更新的列)就会误判为多用户冲突。解决方法:
在SQL Server表中添加该列:ALTER TABLE 问题表名 ADD 行版本列名 rowversion;无需手动赋值,SQL Server会自动维护每行的版本标识,Access链接后会自动使用该列做冲突检测。
SQL Server端触发器/约束的隐性修改:
若表存在UPDATE/DELETE触发器,或有默认值、计算列等自动修改数据的逻辑,Access读取数据后,这些逻辑会改变行数据,导致Access认为数据被其他用户修改。排查方法:
暂时禁用触发器,测试更新/删除是否正常;若恢复正常,调整触发器逻辑,避免在用户操作时修改Access未跟踪的列。Access链接表主键识别错误:
即使SQL Server端有主键,Access链接时可能未正确识别。打开Access中链接表的设计视图,确认主键列旁有钥匙图标;若没有,右键点击对应列,选择「主键」手动设置,然后保存链接表。未提交的SQL Server事务:
若SQL Server端存在未提交的事务(比如之前操作中断未回滚),会导致行锁未释放,Access执行更新/删除时触发冲突。执行以下命令检查:DBCC OPENTRAN;若存在未提交事务,确认无业务影响后用
ROLLBACK TRANSACTION回滚。数据类型兼容性问题:
若表中存在SQL Server特有的数据类型(如datetime2、varchar(max)、nvarchar(max)),旧版Jet驱动可能无法正确解析,导致Access无法跟踪行变化。尝试将此类列转换为兼容类型(如datetime、varchar(8000))后测试。
内容的提问来源于stack exchange,提问作者intellicon

