You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Access无DSN链接SQL Server时,不同权限账号链接表权限覆盖问题求助

解决Access链接SQL Server时不同凭据权限被覆盖的问题
  • 问题根源:Access默认启用ODBC连接池,会复用首个建立的数据库连接会话,即便后续TableDef的连接字符串使用不同凭据,实际仍共享同一连接,导致所有表权限被首个链接表的凭据覆盖。

  • 核心解决方案:在每个链接表的连接字符串中添加OLE DB Services=-2,禁用连接池,强制每个链接表使用独立的连接会话。

VBA代码示例

' 链接只读表
Sub LinkReadOnlyTables()
    Dim db As DAO.Database
    Dim tdf As DAO.TableDef
    Dim strReadOnlyConn As String
    
    Set db = CurrentDb()
    ' 替换为你的服务器、数据库、只读账号信息,关键添加OLE DB Services=-2
    strReadOnlyConn = "ODBC;DRIVER=SQL Server;SERVER=你的SQL服务器名;DATABASE=目标数据库名;" & _
                      "UID=只读账号;PWD=只读密码;OLE DB Services=-2"
    
    ' 示例:链接单个只读表,可循环批量处理
    Set tdf = db.CreateTableDef("本地只读表名")
    tdf.Connect = strReadOnlyConn
    tdf.SourceTableName = "dbo.远程只读表名"
    db.TableDefs.Append tdf
    
    Set tdf = Nothing
    Set db = Nothing
End Sub

' 链接读写表
Sub LinkReadWriteTables()
    Dim db As DAO.Database
    Dim tdf As DAO.TableDef
    Dim strReadWriteConn As String
    
    Set db = CurrentDb()
    ' 替换为你的服务器、数据库、读写账号信息,同样添加OLE DB Services=-2
    strReadWriteConn = "ODBC;DRIVER=SQL Server;SERVER=你的SQL服务器名;DATABASE=目标数据库名;" & _
                       "UID=读写账号;PWD=读写密码;OLE DB Services=-2"
    
    ' 示例:链接单个读写表,可循环批量处理
    Set tdf = db.CreateTableDef("本地读写表名")
    tdf.Connect = strReadWriteConn
    tdf.SourceTableName = "dbo.远程读写表名"
    db.TableDefs.Append tdf
    
    Set tdf = Nothing
    Set db = Nothing
End Sub
  • 注意事项:
    • 无需在意只读/读写表的链接顺序,每个表的连接都会独立建立
    • 确保替换代码中所有占位符为实际的服务器、数据库、账号信息
    • 批量处理时可通过循环遍历需要链接的表名列表,避免重复代码

内容的提问来源于stack exchange,提问作者Don Carrier

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 21:36:35