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

使用OPENDATASOURCE读取网络路径Excel文件遇权限错误排查

问题场景

在SQL Server Management Studio(SSMS)中执行以下SQL读取Excel文件:

SELECT top 2 * FROM OPENDATASOURCE('Microsoft.ACE.OLEDB.12.0', 'Data Source=C:\SSIS\Excel.xlsx;Extended Properties="EXCEL 12.0;IMEX=1;HDR=NO"')...[Sheet1$];

SELECT top 2 * FROM OPENDATASOURCE('Microsoft.ACE.OLEDB.12.0', 'Data Source=\\app1\App_Files\SSIS\Excel.xlsx;Extended Properties="EXCEL 12.0;IMEX=1;HDR=NO"')...[Sheet1$];

触发报错的条件

  • 本地运行SSMS
  • Excel文件存于网络共享路径
  • 使用Active Directory(AD)用户登录SSMS(该用户可通过资源管理器访问目标文件,且与SQL Server服务账户为同一用户)

报错信息

OLE DB provider "Microsoft.ACE.OLEDB.12.0" for linked server "(null)" returned message "The Microsoft Access database engine cannot open or write to the file '\app1\App_Files\SSIS\Excel.xlsx'. It is already opened exclusively by another user, or you need permission to view and write its data.".
Msg 7303, Level 16, State 1, Line 3
Cannot initialize the data source object of OLE DB provider "Microsoft.ACE.OLEDB.12.0" for linked server "(null)".

可正常运行的修改项

  • 在SQL Server服务器上直接运行SSMS
  • 使用SQL Server身份验证(SQL用户)而非AD用户
  • 将Excel文件移至服务器本地路径

已验证本地执行select auth_scheme from sys.dm_exec_connections where session_id=@@spid返回KERBEROS,但问题仍未解决;服务器上执行该语句返回NTLM且可正常读取文件。


排查方向与解决方案

一、验证Kerberos委派配置完整性

虽然auth_scheme显示为KERBEROS,但需确认以下核心配置是否到位:

  1. SQL Server服务账户的委派设置:
    • 在AD用户和计算机中,找到SQL Server服务账户,打开属性→委派标签,确保勾选「信任此用户用于委派到任何服务(仅限Kerberos)」,或针对目标文件共享的服务(如cifs/app1)设置约束委派。
    • 执行setspn -L <SQL服务账户>,确认存在MSSQLSvc/<SQL服务器名>:<端口>和MSSQLSvc/<SQL服务器FQDN>:<端口>两种SPN。
  2. 文件共享服务器的SPN:
    • 执行setspn -L <文件服务器计算机账户>,确认已注册cifs/app1和cifs/app1.域名的SPN。
  3. 本地Kerberos票据验证:
    • 执行klist get MSSQLSvc/<SQL服务器FQDN>:<端口>,确认能获取有效Kerberos票据,且票据包含正确的委派权限。

二、检查ACE驱动的运行上下文限制

Microsoft ACE OLEDB驱动跨网络访问时存在兼容性与权限限制:

  1. 32位/64位一致性:
    • 确保SQL Server与ACE驱动位数完全一致(均为32位或64位),混合位数会导致权限传递异常。
  2. 驱动交互权限:
    • 在SQL Server服务属性→登录标签中,临时勾选「允许服务与桌面交互」测试(生产环境需谨慎),排查驱动是否因无法访问交互桌面导致权限问题。
  3. 文件共享与NTFS权限:
    • 确认SQL Server服务账户在目标文件共享(\\app1\App_Files)和Excel文件的NTFS权限中拥有读取权限,即使AD用户与服务账户为同一用户,服务进程的权限上下文仍需单独配置。

三、替代方案(绕过Kerberos限制)

若Kerberos配置无法快速解决,可采用以下临时方案:

  1. SQL Server代理作业:
    • 在服务器上创建代理作业,以SQL Server服务账户或拥有共享权限的AD账户运行读取Excel的SQL,本地SSMS仅调用作业或查看结果。
  2. 服务器端映射网络驱动器:
    • 在SQL Server服务器上,以服务账户身份映射网络驱动器(如Z:对应\\app1\App_Files\SSIS),OPENDATASOURCE中使用映射路径Z:\Excel.xlsx,需确保映射在服务启动时自动建立。
  3. 改用OPENROWSET:
    • 尝试使用OPENROWSET语句,权限传递逻辑可能不同:
      SELECT TOP 2 * 
      FROM OPENROWSET('Microsoft.ACE.OLEDB.12.0', 
                      'Excel 12.0;IMEX=1;HDR=NO;Database=\\app1\App_Files\SSIS\Excel.xlsx', 
                      [Sheet1$]);
      

四、其他排查要点

  • 确认目标Excel文件未被其他程序锁定(如Excel客户端打开),报错信息中的「已被独占打开」可能是真实情况,关闭所有关联程序后重试。
  • 在SSMS中打开「服务器对象→链接服务器→提供者→Microsoft.ACE.OLEDB.12.0」,确保勾选「允许进程内」和「动态参数」选项。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 16:31:14