运行于Ubuntu的MSSQL执行OPENROWSET报错系统找不到指定路径如何解决
问题根因
错误代码3(The system cannot find the path specified.)
该错误的触发和你配置的文件本身权限无关,当前文件的属主、读写权限已经满足需求,问题出在以下几个层面:
- 父目录权限不足:Linux系统下访问文件需要路径中每一级父目录都拥有执行(x)权限,你仅配置了JSON文件本身的权限,未给
/home、/home/user两级目录配置mssql用户的执行权限,导致mssql用户无法进入目录读取文件。 - MSSQL服务访问限制:Ubuntu环境下MSSQL服务的默认systemd配置开启了
ProtectHome=true参数,该参数会直接禁止服务进程访问/home目录下的所有内容,哪怕文件权限配置正确也无法读取。 - 路径大小写不匹配:Linux是大小写敏感系统,如果查询语句中的文件路径、文件名和实际存储的大小写不一致,也会触发路径不存在错误。
解决方法
方案1(推荐,无安全风险)
将JSON文件移动到MSSQL默认拥有访问权限的目录下操作,不需要修改系统配置,步骤如下:
- 移动文件到MSSQL工作目录:
sudo mv /home/user/RC_2015-01.json /var/opt/mssql/ - 重新确认文件属主配置:
sudo chown mssql:mssql /var/opt/mssql/RC_2015-01.json - 修改查询语句中的文件路径:
Declare @JSON varchar(max) SELECT @JSON=BulkColumn FROM OPENROWSET (BULK '/var/opt/mssql/RC_2015-01.json', SINGLE_CLOB) import SELECT * FROM OPENJSON (@JSON)
修改完成后重新执行查询即可。
方案2(需修改服务配置,适合必须保留文件在/home目录的场景)
如果需要保留文件在原路径,按以下步骤操作:
- 配置父目录权限,给其他用户添加执行权限:
sudo chmod o+x /home /home/user - 关闭MSSQL服务的Home目录访问限制:
- 编辑MSSQL服务的systemd覆盖配置:
sudo systemctl edit mssql-server.service - 在编辑界面输入以下配置:
[Service] ProtectHome=false
- 保存退出后重新加载配置并重启服务:
sudo systemctl daemon-reloadsudo systemctl restart mssql-server
- 确认路径大小写完全匹配,执行以下命令校验路径正确性:
ls /home/user/RC_2015-01.json
校验无报错后重新执行查询即可。
内容的提问来源于stack exchange,提问作者pundip
相关产品推荐
相关产品推荐

