无法批量加载。操作系统错误代码5(访问被拒绝。)

问题描述 投票:22回答:10

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

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语句。

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

windows authentication http://iforce.co.nz/i/daaqcasj.vo1.png

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

bulkadmin http://iforce.co.nz/i/bou0uklk.wdj.png

但就我所知,即使我已经正确设置了一切,我仍然会收到错误。直接从SQL Server Management Studio执行批量插入。

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

这是没有意义的,因为显然bulkadmins可以运行声明,我是否打算重新配置bulkadmin如何工作? (我迷路了)关于如何修复它的任何想法?

sql-server tsql bulkinsert
10个回答
18
投票

使用SQL Server身份验证时,将显示此错误,并且不允许SQL Server访问批量装入文件夹。

因此,让SQL Server访问该文件夹将解决该问题。

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


0
投票

在我们的例子中,它最终成为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"

12
投票

我不认为重新安装SQL Server会解决这个问题,它只会耗费一些时间。

  1. 确认您的用户帐户具有相关文件夹的读取权限。
  2. 使用像Process Monitor这样的工具来查看用户实际尝试访问该文件的内容。
  3. 我的猜测是,尝试访问该文件的不是Michael-PC\Michael,而是SQL Server服务帐户。如果是这种情况,那么您至少有三个选项(但可能还有其他选项): 一个。将SQL Server服务设置为以您的身份运行。 湾授予SQL Server服务帐户对该文件夹的显式访问权限。 C。将文件放在SQL Server可以访问的更合理的位置,或者可以使其具有访问权限(例如C:\bulk\)。

我建议假设这是一个包含的本地工作站。当我们谈论生产机器时,对SQL Server的本地文件系统访问肯定存在更严重的安全问题,当然这仍然可以通过使用上面的c.来大大减轻 - 并且只允许服务帐户访问您想要的文件夹能够触摸


4
投票

我有同样的问题SSIS 2012,解决方案是使用Windows身份验证。我正在与sa用户使用SQL身份验证。


3
投票

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


2
投票

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


2
投票
  1. 转到start run => services.msc => SQL SERVER(MSSQLSERVER)停止服务
  2. 右键单击SQL SERVER(MSSQLSERVER)=> properties => LogOn Tab =>本地系统帐户=>确定
  3. 重新启动SQL Server Management Studio。

1
投票

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


1
投票

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

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


0
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.