MS Access连接SQL Server 2019无法修改无主键链接表问题咨询
核心原因
MS 365 Access无法修改/删除SQL Server 2019无主键链接表,而SQL Server 2012下可行,主要源于以下三个关键差异:
1. ODBC驱动的行识别逻辑变更
SQL Server 2012通常搭配SQL Server Native Client 11.0驱动,该驱动对无主键表的处理较为宽松——默认会将表中所有字段的组合视为隐含的唯一标识符,让Access能生成UPDATE/DELETE语句定位目标行。
而SQL Server 2019推荐使用的ODBC Driver 17/18 for SQL Server则遵循更严格的规范:仅当表存在显式主键或唯一约束时,才会向Access提供可靠的行定位信息。无主键时,驱动不会自动推断唯一字段组合,导致Access无法确定如何定位要修改的记录。
2. MS 365 Access的连接属性默认规则收紧
MS 365 Access对新SQL Server版本的链接表默认启用了更严格的行定位校验。在旧环境(SQL Server 2012)中,Access可能自动将所有字段标记为“唯一记录标识符”;但在连接SQL Server 2019时,Access不再自动执行这个推断,必须有显式的主键/唯一约束,或手动指定唯一标识字段,才能支持写操作。
3. SQL Server 2019的元数据返回行为变更
SQL Server 2019在返回表元数据时,不再向Access提供可用于推断行唯一性的额外信息(比如旧版本中可能返回的统计信息候选键)。只有当表定义了主键或唯一约束时,元数据才会包含明确的行定位标识,否则Access无法生成合法的修改语句。
无需添加标识字段的临时解决方案
如果不想因新增标识字段破坏依赖SELECT *的业务环节,可以手动为链接表指定唯一记录标识符:
- 打开Access,点击文件 > 选项 > 当前数据库,取消勾选“禁用设计视图修改链接表”
- 右键目标链接表,选择设计视图
- 在设计视图中,选择一个或多个字段(确保这些字段的组合在表中是唯一的),右键点击字段名,选择主键(此操作仅在Access本地标记,不会同步到SQL Server)
- 保存设计视图,此时Access即可基于指定的字段组合生成UPDATE/DELETE语句,支持修改和删除操作
内容的提问来源于stack exchange,提问作者emjaySX

