【问题标题】:SQL Server: accessing CSV files as linked server with Windows authenticationSQL Server:使用 Windows 身份验证作为链接服务器访问 CSV 文件
【发布时间】:2022-01-03 22:58:15
【问题描述】:

祝大家新年快乐!

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

无法初始化 OLE DB 提供者的数据源对象 链接服务器“LS_Text”的“Microsoft.ACE.OLEDB.12.0”。

我计划通过调用存储过程的应用程序导入文件。所以 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表示链接服务器无需登录名和密码即可访问。我尝试了各种其他组合,但都没有成功。

在 Google 上找到的有关此错误消息的文章处理的是 OPENROWSET 而不是链接服务器。或者用ACE驱动配置。但这不是问题,因为它是 SA

那么如何通过 Windows 身份验证查询 CSV 文件?任何提示表示赞赏。

【问题讨论】:

  • 为什么要使用链接服务器或不使用 OPENROWSET 之类的东西?
  • 我更喜欢一次性完成所有设置,然后运行一个简单的 INSERT INTO ... SELECT 查询。其他文件和查询可能会随之而来。
  • 那既不是这里也不是那里。 SQL Server 可以使用 OPENROWSET 本机加载 CSV 文件。 docs.microsoft.com/en-us/sql/t-sql/functions/…Microsoft.ACE.OLEDB.12.0 是 Office 桌面驱动程序,不支持没有本地桌面会话的场景。
  • 您想使用INSERT INTO...SELECT 并没有说明您为什么要使用链接服务器,也没有说明您不想使用OPENROWSET
  • @David Browne 和 Larnu 好的,我知道我必须使用 OPENROWSET。感谢您的回复。

标签: sql-server csv linked-server


【解决方案1】:

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

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

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

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

【讨论】:

  • 康纳您好,非常感谢。你已经解释得很清楚了。我会深入探讨这个问题。同时,我正在尝试使用 OPENROWSET 和格式文件。这需要时间,我会在之后通知您。同时,我标记您的答案,因为如果有解决方案,这显然是解决问题的方法。
  • 最后,OPENROWSET BULK 适用于 Windows 身份验证。所以这个问题就解决了。查询比链接服务器更庞大,但没关系。代码页仍然存在一些问题。但是,如果我自己无法解决,那将是另一个话题。再次感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多