【问题标题】:Cannot bulk load because the file could not be opened. Operating System Error Code 3无法批量加载,因为无法打开文件。操作系统错误代码 3
【发布时间】:2013-10-29 18:50:49
【问题描述】:

我正在尝试将存储过程设置为 SQL Server 代理作业,它给了我以下错误,

无法批量加载,因为无法打开文件“P:\file.csv”。操作系统错误代码 3(无法检索此错误的文本。原因:15105)。 [SQLSTATE 42000](错误 4861)

有趣的是,当我手动执行存储过程时,它工作得很好。

驱动器 P: 是 Windows SQL Server 上通过 Samba Share 从 LINUX 上共享的驱动器,它是通过执行以下命令设置的,

EXEC xp_cmdshell 'net use P:"\lnxusanfsd01\Data" 密码 /user:username /Persistent:Yes'

对此的任何帮助将不胜感激

【问题讨论】:

  • 看起来是权限问题。与手动运行相比,SQL Server 代理通常以不同的用户/具有不同的权限运行。如果文件在本地目录中,代理是否工作?代理是否也在运行net use 命令?
  • 代理没有运行 net use 命令。我没有测试过,因为我没有对 SQL Server 的 RDP 访问权限
  • 那么,如果将net use cmd 添加到代理作业中是否有效?如果没有它,我很确定 P: 驱动器将仅在您的用户名的 Windows 会话中可用,而不是代理的。
  • 我可以添加 net use 命令,但唯一的问题是它会在每次作业运行时尝试映射目录,例如第二次运行时以及尝试分配 P : 再次驱动会报错。我如何得到这个排序?
  • 在批量加载后运行 net use /delete P: 将其删除

标签: sql-server stored-procedures samba sql-server-agent bulk-load


【解决方案1】:

我不知道你是否解决了这个问题,但我有同样的问题,如果实例是本地的,你必须检查访问文件的权限,但如果你是从计算机访问服务器(远程访问),你有指定服务器中的路径,这意味着将文件包含在服务器目录中,这解决了我的情况

示例:

BULK INSERT Table
FROM 'C:\bulk\usuarios_prueba.csv' -- This is server path not local
WITH 
  (
     FIELDTERMINATOR =',',
     ROWTERMINATOR ='\n'
  );

【讨论】:

  • 谢谢,您准确地指出了我的问题并解决了我 15 分钟的“文件在那里,您为什么看不到?”。
  • 谢谢@DuSant 文件的权限是什么? - 右键单击​​ -> 安全 -> 编辑 -> 谁拥有完全控制权。谢谢!
【解决方案2】:

为了简单起见,我只是将导入数据的目录更改为服务器上的本地文件夹

我的文件位于共享文件夹中,我只是将文件复制到服务器上的“c:\TEMP\Reports”(从新文件夹将查询更新为 BULK INSERT)。代理任务成功完成:)

终于在很长一段时间后,我能够通过代理作业自动批量插入。

最好的问候。

【讨论】:

    【解决方案3】:

    我已经解决了这个问题,

    登录到安装 SQL Server 的服务器计算机获取 csv 服务器计算机上的文件并执行您的查询,它将插入 记录。

    如果您将给出数据类型兼容性问题,请更改该列的数据类型

    【讨论】:

    • 如果可以的话,我会投票 100 次...我通常在我的开发箱上的 SQL Server 上进行开发,因此本地引用“C:\temp\”通常可以工作.. .但是我是在另一个SQL Server上测试的。谢谢!!!
    【解决方案4】:

    通过 Windows 身份验证使用 SQL 连接: “Kerberos 双跳”正在发生:一跳是您的客户端应用程序连接到 SQL Server,第二跳是 SQL Server 连接到远程“\\NETWORK_MACHINE\”。这样的双跳受到约束委派的限制,您最终以匿名登录的身份访问共享,因此访问被拒绝。

    要解决此问题,您需要为 SQL Server 服务帐户启用约束委派。 See here for a good post that explains it quite well

    使用 SQL 身份验证的 SQL Server 您需要为您的 SQL 登录创建一个凭据,并使用它来访问该特定网络资源。 See here

    【讨论】:

      【解决方案5】:

      我建议没有为 sql server 启动的帐户映射 P: 驱动器。

      【讨论】:

      • P: 驱动器未映射到 sql server 已启动的帐户,这意味着 windows 用户,但未明确映射。只是验证您的意思是 windows 用户?
      【解决方案6】:

      这可能是权限问题,但您需要确保尝试以下步骤进行故障排除:

      • 将文件放在本地驱动器上,看看作业是否有效(如果可以将本地工作站上的驱动器号映射到数据库服务器上的目录,则不一定需要 RDP 访问权限)
      • 将文件放在不需要用户名和密码的远程目录(允许所有人阅读)并使用 UNC 路径 (\server\directory\file.csv)
      • 将 SQL 作业配置为以您自己的用户名运行
      • 将 SQL 作业配置为以sa 运行,并在前后添加net usenet use /delete 命令

      请记住撤消任何更改(尤其是以sa 运行)。如果没有其他方法,您可以尝试将批量加载更改为计划任务,在数据库服务器或安装了 bcp 的其他服务器上运行。

      【讨论】:

      • 如何将 SQL 作业配置为以您自己的用户名运行?我登录并在 UserMapping 期间选择了 msdb 并为 SQLAgent 提供了权限。对吗?
      • 我现在无法访问 SQL Server,但根据您的版本,它可能看起来像这样 i31.tinypic.com/zjdqh3.jpg
      • 我尝试使用 SQL Server 身份验证来运行 SQL 作业,但出现以下错误,服务器主体“sqldev01”在当前安全上下文下无法访问数据库“mydatabase”。 sqldev01 帐户对我试图插入 csv 文件的 mydatabase 具有 db_owner 访问权限。它还具有对 Master 数据库的 db_owner 访问权限,并且还具有 Bulkadmin 角色。请帮忙
      • 看起来您正处于故障排除的困境中。您可以尝试其他建议之一吗?
      【解决方案7】:

      我确实尝试过授予对文件夹的访问权限,但这并没有帮助。 我的解决方案是为登录用户选择以下红色突出显示的选项

      【讨论】:

      • 这可能是您重新考虑的问题。理想情况下,您只想提供最低权限,并且只在此上传需要时添加它们(并在上传完成后立即删除它们)。事实上,这个人可以完全删除你的整个数据库/删除表/或做任何意外的事情。
      猜你喜欢
      • 2018-04-18
      • 2021-10-30
      • 2021-02-06
      • 2020-02-08
      • 2021-02-26
      • 2013-01-11
      • 1970-01-01
      • 2011-09-14
      • 2018-08-23
      相关资源
      最近更新 更多