SQL Server:使用Windows身份验证作为链接服务器访问CSV文件



祝大家新年快乐!

我定期从web应用程序下载的CSV文件中导入数据。我已经用CSV文件为本地路径创建了链接服务器LS_Text。我在存储过程中使用INSERT INTO ... SELECT查询导入文件内容。只要我以SA的身份登录到SSMS,这就可以正常工作。但如果我使用Windows身份验证登录,我会收到错误

无法初始化OLE DB访问接口的数据源对象"Microsoft.ACE.OLEDB.12.0";对于链接服务器";LS_Text";。

我计划通过调用存储过程的应用程序导入文件。因此,Windows身份验证必须起作用。

错误消息是什么意思?如果文件路径不存在,则会出现相同的错误消息。因此,SQL Server或OLEDB提供程序似乎看不到包含CSV文件的文件夹。但我自己用我的信用卡保存了这些文件。

我已经用以下批创建了链接服务器:

EXEC sp_addlinkedserver @server = N'LS_Text', @srvproduct=N'CSVFLATFILE',
@provider=N'Microsoft.ACE.OLEDB.12.0', @datasrc=N'C:Trans', @provstr=N'Text;HDR=Yes';
EXEC sp_addlinkedsrvlogin @rmtsrvname = N'LS_Text', @useself = 'false',
@locallogin = NULL, @rmtuser = NULL, @rmtpassword = NULL;
EXEC sp_MSset_oledb_prop N'Microsoft.ACE.OLEDB.12.0', N'AllowInProcess', 1;

据我所知,@useself = 'false', @rmtuser = NULL, @rmtpassword = NULL意味着可以在没有登录和密码的情况下访问链接的服务器。我尝试过其他各种组合,但都没有成功。

在谷歌上找到的关于此错误消息的文章处理的是OPENROWSET,而不是链接服务器。或者使用ACE驱动程序配置。但这不是问题所在,因为它作为SA工作。

那么,如何使用Windows身份验证查询CSV文件呢?任何提示都将不胜感激。

也许这不是一个完整的答案,但它有望帮助您更好地调试这类问题。正如您所提到的,由于它是作为sa工作的,因此可能的问题与用户/登录映射有关。文档页面sp_addlinedsrvlogin文档中有一个示例,描述了如何尝试特定的Windows登录。这可能值得一试,看看你的证书是否有效。其次,有一些方法可以深入研究服务器的代码路径中发生了什么,以加载和使用提供程序。在这里可以找到一篇合理的博客文章,它是关于与Oracle对话的,但重要的内容是关于如何为链接的服务器设置跟踪事件,以及在您开始尝试执行查询后会发生什么。(链接服务器与链接服务器的openrowset并不重要,但请注意,术语openrowset在SQL中被重载,以允许不同的代码路径,包括一些不直接通过OLE/DB或不通过此特定的OLE/DB访问接口的代码路径(如David在对您的问题的评论中提到的(。因此,跟踪错误之前的操作可能会指出在windows登录情况下与sa/admin路径不同的失败点。最后,由于Jet(现在的ACE(提供程序从根本上讲是一个DLL,它被加载到SQL Server进程中,然后执行文件系统操作来尝试加载文件,因此只使用procmon来监视进程并查看是否有某些操作失败(如读取注册表项或打开提供程序中的文件(可能很有价值。考虑到sa对你有效,这似乎不是最有可能的问题,但它可能是一个有用的工具。

您还询问了错误消息。我会尽力解释的。(我编写了最初的Jet OLE/DB提供程序,后来在我更换团队后更名为ACE(。在OLE/DB中,有一些COM接口在概念上";活的";关于4个主要内部类。您可以在OLE/DB程序员指南中看到这一点。数据源对象是最上面的对象,它对不同的数据源意味着不同的东西。第二个层次的概念是";会话";。在Jet/ACE中,这两个概念并没有真正的区别,因为您只需要连接到一个文件,但在SQL Server和其他服务器中,数据源对象是到服务器的连接,会话是到该服务器的单独连接。您收到的错误表明,与提供程序的初始连接/身份验证失败。这意味着N件事中的一件,但我会从检查";从SQL的登录到Jet/ACE的登录的映射不能正常工作";。

net-如果你能通过正常路径(openrowset(BULK+CSV格式(加载CSV,你的生活可能会像David建议的那样,从长远来看会更好。

祝你好运,调试你的问题,无论你选择什么路径。

最新更新