【问题标题】:Cannot bulk load. Operating system error code 5 (Access is denied.)无法批量加载。操作系统错误代码 5(拒绝访问。)
【发布时间】:2013-01-11 09:24:04
【问题描述】:

由于某些奇怪的原因,我在执行批量插入时遇到问题。

BULK INSERT customer_stg
FROM 'C:\Users\Michael\workspace\pydb\data\andrew.out.txt'
WITH
(
    FIRSTROW=0,
    FIELDTERMINATOR='\t',
    ROWTERMINATOR='\n'
)

在阅读 this 后,我确信我已经正确设置了我的用户角色,正如它所说...

bulkadmin 固定服务器角色的成员可以运行 BULK INSERT 语句。

我已为 Windows 身份验证正确设置了 Login Properties(如下所示)。以授予对 bulkadmin 的服务器范围权限


(来源:iforce.co.nz

并且命令EXEC sp_helpsrvrolemember 'bulkadmin'告诉我上面的信息是成功的,当前用户Michael-PC\Michaelbulkadmin权限。


(来源:iforce.co.nz

但是,尽管据我所知,我已经正确设置了所有内容,但我仍然收到错误消息。直接从 SQL Server Management Studio 执行批量插入。

消息 4861,第 16 层,状态 1,第 2 行
无法批量加载,因为无法打开文件“C:\Users\Michael\workspace\pydb\data\andrew.out.txt”。操作系统错误代码 5(访问被拒绝。)。

这没有意义,因为显然bulkadmins 可以运行该语句,我是否打算重新配置bulkadmin 的工作方式? (我迷路了)。关于如何解决它的任何想法?

【问题讨论】:

  • 听起来问题出在 SQL Server 外部。可以用记事本打开文件吗?
  • 是的,我可以在记事本中打开它。
  • 如果服务器不是本地的,social.msdn.microsoft.com/Forums/en/transactsql/thread/… 可能是相关的
  • 现在我只是尝试重新安装 SQL Server,因为它在为什么我被限制访问文件时没有逻辑意义。
  • 你能否设置文件的路径,使其可以从网络访问,比如“Michael-PC\C$\...\Andrew.out.txt”并将其传递给命令行?

标签: sql-server tsql bulkinsert


【解决方案1】:

当您使用 SQL Server 身份验证并且不允许 SQL Server 访问批量加载文件夹时,会出现此错误。

因此,授予 SQL Server 对该文件夹的访问权限将解决该问题。

这里是如何: 转到文件夹右键单击->属性->安全选项卡->编辑->添加(在新窗口上)->高级->立即查找。在搜索结果中的用户列表下,找到类似 SQLServerMSSQLUser$UserName$SQLExpress 的内容,然后单击确定,即可打开所有对话框。

【讨论】:

  • 我找不到正确的帐户来授予访问权限,但是当我只是试图从我的开发机器加载文件时,我将文件的读取权限授予“所有人”(这就是我作为帐户名/委托人输入)。
  • necro,但有官方文档,可能更简单:docs.microsoft.com/en-us/sql/database-engine/configure-windows/… - 基本上,添加 NT SERVICE\MSSQLSERVER 用户
  • 我无法确定要向哪个用户添加权限,所以只使用了每个人。我找不到名为“NT SERVICE\MSSQLSERVER”的用户
  • “批量加载文件夹”到底在哪里?这是否意味着存储您尝试加载的文件的文件夹?
  • @AlbatrossCafe 是的批量加载文件夹只是意味着您正在批量插入文件所在的文件夹。对我来说,为名为 SERVICE 的用户添加文件夹的权限是可行的。
【解决方案2】:

我认为重新安装 SQL Server 并不能解决此问题,它只会浪费一些时间。

  1. 确认您的用户帐户对相关文件夹具有读取权限。
  2. 使用Process Monitor 之类的工具查看实际尝试访问文件的用户。
  3. 我的猜测是尝试访问文件的不是Michael-PC\Michael,而是SQL Server 服务帐户。如果是这种情况,那么您至少有三个选项(但可能还有其他选项):

    一个。将 SQL Server 服务设置为随您运行。
    乙。授予 SQL Server 服务帐户对该文件夹的显式访问权限。
    c。将文件放在 SQL Server 可以访问或可以访问的更合乎逻辑的位置(例如C:\bulk\)。

我建议这些东西,假设这是一个封闭的本地工作站。当我们谈论生产机器时,从 SQL Server 访问本地文件系统肯定存在更严重的安全问题,当然这仍然可以通过使用上面的c. 来很大程度上缓解 - 并且只允许服务帐户访问您的文件夹希望它能够触摸。

【讨论】:

  • 它只是我用来构建和测试软件的机器,而不是生产系统。
【解决方案3】:

我在 SSIS 2012 中遇到了同样的问题,解决方案是使用 Windows 身份验证。我正在对 sa 用户使用 SQL 身份验证。

【讨论】:

  • 最快的解决方案。
【解决方案4】:

尝试为“MSSQLSERVER”用户(或在 Windows 服务中将 SQL Server 服务设置为 登录身份 的任何用户)授予包含 CSV 和格式文件读取权限的文件夹)

【讨论】:

  • 非常感谢 - 在 @antew 的回答之后,我尝试在列表中查找 SQLMSSQL 但不能。我看到MSSQLlog on aswindows service 中的“本地服务”。我在安全性中添加了“本地服务”并修复了权限问题。
【解决方案5】:
  1. 开始运行=>services.msc=>SQL SERVER(MSSQLSERVER) 停止服务
  2. 右键单击 SQL SERVER(MSSQLSERVER)=> 属性=>登录选项卡=>本地系统帐户=>确定
  3. 重新启动 SQL Server Management Studio。

【讨论】:

  • 在我在网上找到的众多建议解决方案中,这个解决方案实际上解决了我的问题。谢谢你,@Vinay Patel
【解决方案6】:

这对我有用:

使用 Windows 身份验证登录 SSIS。

1.打开服务,找到MSSQL NT服务账户名并复制:

2. 打开 SQL 服务器应该从中读取的文件夹。 安全 - 组或用户名选项卡 - 添加并粘贴复制的帐户:**

  1. 您可能会收到“发现多个名称错误”,只需选择 MSSQL 用户:

您的BULK INSERT 查询现在应该可以正常运行了。 如果问题仍然存在,请尝试以相同方式将 SQL Server 代理帐户添加到文件夹权限。 确保在完成后重新启动服务中的 MSSQL 服务器。

【讨论】:

    【解决方案7】:

    有时这可能是虚假的错误消息,请尝试使用与运行进程相同的帐户打开文件。我在我的环境中遇到了同样的问题,当我打开文件(使用相同的凭据运行进程)时,它说它必须与已知程序相关联,在我这样做之后我能够打开它并运行过程没有任何错误。

    【讨论】:

      【解决方案8】:

      我解决这个问题的方法很简单:

      1. 打开 SQL Server
      2. 右键单击数据库(您要备份)
      3. 选择属性
      4. 选择权限
      5. 选择您的数据库角色(本地或云)
      6. 在底部您会看到明确的权限表
      7. 找到“备份数据库”权限并点击授予权限。

      您的问题已解决。

      【讨论】:

        【解决方案9】:

        确保您使用的文件 ('C:\Users\Michael\workspace\pydb\data\andrew.out.txt') 位于 SQL 服务器计算机上,而不是运行 MSSMS 的客户端计算机上。

        【讨论】:

        • 客户端机器为sql server(开发机器)
        【解决方案10】:

        1) 打开 SQL 2)在任务管理器中,您可以检查哪个帐户正在运行 SQL - 它可能不是 Jan 写的 Michael-PC\Michael。

        运行 SQL 的帐户需要访问共享文件夹。

        【讨论】:

          【解决方案11】:

          当我在 SSMS 中执行批量插入时,我遇到了类似的问题,但它在将任务转换为 SQL Server 代理时失败并返回“操作系统故障代码 5”。

          在浏览了之前发布的大量解决方案后,这种方式通过授予 NT SERVER/SQLSERVERAGENT 对源文件夹的“完全控制”访问权限来解决我的问题。 希望它能给这些仍在为错误消息而苦苦挣扎的人带来一些启示。

          【讨论】:

            【解决方案12】:

            在我们的例子中,它最终成为了一个 Kerberos 问题。我按照本文中的步骤解决了这个问题:https://techcommunity.microsoft.com/t5/SQL-Server-Support/Bulk-Insert-and-Kerberos/ba-p/317304

            归结为在运行 BULK INSERT 语句的 SQL Server 的计算机帐户上配置委派。机器帐户需要能够通过“cifs”服务委托给文件所在的文件服务器。如果您使用的是约束委派,请确保指定“使用任何身份验证协议”。

            如果涉及到 DFS,可以执行以下 Powershell 命令来获取文件服务器的名称:

            Get-DfsnFolderTarget -Path "\\dfsnamespace\share"
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2020-02-08
              • 1970-01-01
              • 2021-02-26
              • 1970-01-01
              • 2018-04-18
              • 2020-07-10
              • 1970-01-01
              • 2020-10-24
              相关资源
              最近更新 更多