0

Windows Server 2008 R2 x64 SP1、Sql Server 2008 x64 SP3、Access 数据库引擎 x64 SP1

我有链接服务器:

EXEC master.dbo.sp_addlinkedserver @server = N'dbf2', @srvproduct=N'dbf2', @provider=N'MSDASQL', @provstr=N'DRIVER={Microsoft Access dBASE Driver (*.dbf, *.ndx, *.mdx)};'

从本地磁盘查询 dbf 文件时一切正常:

select * from openquery(dbf2, 'select * from c:\\V4C8MA6.dbf') a

但是从网络共享查询时

select * from openquery(dbf2, 'select * from \\\\gefest\\upload\\V4C8MA6.dbf') a

我有错误:

Msg 7399, Level 16, State 1, Line 6
The OLE DB provider "MSDASQL" for linked server "dbf2" reported an error. The provider did not give any information about the error.
Msg 7350, Level 16, State 2, Line 6
Cannot get the column information from OLE DB provider "MSDASQL" for linked server "dbf2".

我尝试了不同的变体来描述路径:[],“”,``,\“\”,...。网络共享访问一切正常,sql server 帐户具有所需的访问权限。但...

如何让它发挥作用?

2012 年 5 月 4 日添加:

xp_cmdchell 完美地列出了目录。

这就是我发现的:我创建了链接服务器,其中 sprovstr 指示文件的位置:

@provstr=N'DRIVER={Microsoft Access dBASE Driver (*.dbf, *.ndx, *.mdx)};dbq=\\gefest\upload'

如果我使用sql server auth连接到 sql server,这将有效。

这是 ProcMon 在使用dbq时显示的内容:

日期和时间:2012 年 5 月 4 日上午 9:57:55
事件类别:文件系统
操作:CreateFile
结果:成功
路径:\\gefest\upload\
TID:8588
持续时间:0.0001988
所需访问:读取属性
处置:打开
选项: Open Reparse Point
Attributes: n/a
ShareMode: Read, Write, Delete
AllocationSize: n/a
OpenResult: Opened

这是在查询中指示路径时


日期和时间:2012 年 5 月 4 日上午 9:58:53
事件类别:文件系统
操作:CreateFile
结果:对象路径无效
路径:\\gefest\upload\
TID:8588
持续时间:0.0000819
所需访问:读取属性
处置:打开
选项:打开重分析点
属性:n/a
ShareMode:读取、写入、删除
AllocationSize:n/a

为什么 sql server 在第一次查询时接收到对共享的所需访问权限,而在第二次查询时没有?

第三种和第四种变体是使用windows auth连接到服务器时:

使用dbq


日期和时间:2012 年 5 月 4 日上午 10:02:54
事件类别:文件系统
操作:CreateFile
结果:访问
被拒绝路径:\\gefest\upload\
TID:8588
持续时间:0.0031837
所需访问:读取属性
处置:打开
选项: Open For Backup, Open Reparse Point
属性: n/a
ShareMode: Read, Write, Delete
AllocationSize: n/a
Impersonating: GAZ\kozlovai

在查询中指示路径:


日期和时间:2012 年 5 月 4 日上午 10:02:20
事件类别:文件系统
操作:CreateFile
结果:对象路径无效
路径:\\gefest\upload\
TID:8588
持续时间:0.0000378
所需访问:读取属性
处置:打开
选项:打开备份,打开重分析点
属性:不适用共享
模式:读取、写入、删除
分配大小:不适用
模拟:GAZ\kozlovai

连接到共享时 Sql server 模拟。并且这个帐户 'GAZ\kozlovai' 对共享具有完全访问权限,但 sql server 仍然无法打开文件...

4

1 回答 1

0

检查运行查询的用户身份是否对服务器上的临时文件夹具有读写访问权限。这是因为 SQL Server 将在调用用户而不是 SQLServer 进程帐户的上下文中为查询创建临时文件。

编辑:我至少记得这个问题的一些实例仅通过 UNC 托管共享出现,因此它不是在本地参考上会发生的铅管束带。

只是为了笑,启动 XP_CMDSHELL 并执行 'DIR \\SERVER\SHARE\FOLDER' 并确保您可以通过 SQL Server 中的 UNC 与该路径对话。如果没有,您仍然需要克服访问问题。

最后,如果所有其他方法都失败了,并且您可以登录到服务器,我会启动 Process Monitor 的副本并在该查询触发时观察网络 IO 问题。

于 2012-05-02T23:47:20.067 回答