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

SQL Server: accessing CSV files as linked server with Windows authentication

祝大家新年快乐!

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

Cannot initialize the data source object of OLE DB provider "Microsoft.ACE.OLEDB.12.0" for linked server "LS_Text".

我打算通过调用存储过程的应用程序导入文件。所以 Windows 身份验证必须起作用。

错误信息是什么意思?如果文件路径不存在,则会产生相同的错误消息。所以看起来 SQL 服务器或 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文件呢?任何提示表示赞赏。

也许这不是一个完整的答案,但它应该可以帮助您更好地自己调试此类问题。因为,正如您提到的,它作为 sa,可能的问题与 user/login 映射有关。文档页面 sp_addlinedsrvlogin doc describing how to try a specific Windows login. That might be worth trying for your credentials to see if that works. Second, there are ways to delve into what is happening in the server's code path to load and use the provider. A reasonable blog post can be found here which is about talking to Oracle but the important content is about how to set up trace events for linked servers and see what is happening once you start trying to execute your query. (linked server vs. openrowset to a linked server should not matter, but please note that the term openrowset was overloaded in SQL to allow different code paths including some that don't directly go through OLE/DB or not through this specific OLE/DB provider, as David mentions in the comments to your question). So, tracing the actions before the error may point out a spot where things have failed differently in your windows login case vs. the sa/admin path. Finally, as the Jet (now ACE) provider is fundamentally a DLL that gets loaded into the SQL Server process and then does file system operations to try to load a file, it may be valuable to just use procmon 上有一个示例,用于监视进程并查看是否有某些操作失败(例如读取注册表项或打开提供程序内的文件)。鉴于 sa 适合您,这似乎不是最有可能的问题,但它可能是一个有用的工具。

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

net-net - 如果您可以通过正常路径加载 CSV(openrowset(BULK + CSV 格式),您的生活可能会像大卫建议的那样在 long-运行 中变得更好。

无论您选择何种路径,祝您调试问题顺利。