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

时间:2013-01-28 04:02:10

标签: sql-server tsql bulkinsert

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

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上的服务器范围权限

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

命令EXEC sp_helpsrvrolemember 'bulkadmin'告诉我上述信息已成功,当前用户Michael-PC\Michael拥有bulkadmin权限。

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的工作方式? (我迷路了)关于如何解决它的任何想法?

12 个答案:

答案 0 :(得分:18)

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

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

以下是如何: 转到文件夹右键单击 - > properties-> Security选项卡 - > Edit-> Add(在新窗口中) - > Advanced - >立即查找。在搜索结果中的用户列表下,找到类似SQLServerMSSQLUser $ UserName $ SQLExpress的内容,然后单击“确定”,打开所有对话框。

答案 1 :(得分:12)

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

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

    一个。将SQL Server服务设置为以您的身份运行。
    湾授予SQL Server服务帐户对该文件夹的显式访问权限。
    ℃。将文件放在SQL Server可以访问的更合理的位置,或者可以使其具有访问权限(例如C:\bulk\)。

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

答案 2 :(得分:3)

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

答案 3 :(得分:3)

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

答案 4 :(得分:2)

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

答案 5 :(得分:2)

  1. 开始运行run => services.msc => SQL SERVER(MSSQLSERVER)停止服务
  2. 右键单击SQL SERVER(MSSQLSERVER)=>属性=>“登录”选项卡=>“本地系统帐户” =>“确定”
  3. 重新启动SQL Server Management Studio。

答案 6 :(得分:1)

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

答案 7 :(得分:1)

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

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

答案 8 :(得分:1)

这是我解决此问题的方法非常简单:

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

您的问题已解决。

答案 9 :(得分:0)

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

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

答案 10 :(得分: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"

答案 11 :(得分:0)

这对我有用:

使用Windows身份验证登录SSIS。

1。。打开服务并找到MSSQL NT Service帐户名并将其复制:

enter image description here

2。。打开要从中读取SQL Server的文件夹。 安全-“组或用户名”标签-添加并粘贴复制的帐户:**

enter image description here

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

enter image description here

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