由于一些奇怪的原因,我在执行批量插入时遇到问题。
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
的工作方式? (我迷路了)关于如何解决它的任何想法?
答案 0 :(得分:18)
使用SQL Server身份验证时,会出现此错误,并且不允许SQL Server访问批量装入文件夹。
因此,让SQL Server访问该文件夹将解决该问题。
以下是如何: 转到文件夹右键单击 - > properties-> Security选项卡 - > Edit-> Add(在新窗口中) - > Advanced - >立即查找。在搜索结果中的用户列表下,找到类似SQLServerMSSQLUser $ UserName $ SQLExpress的内容,然后单击“确定”,打开所有对话框。
答案 1 :(得分:12)
我不认为重新安装SQL Server会解决这个问题,它只会消磨一段时间。
我的猜测是,尝试访问该文件的不是Michael-PC\Michael
,而是SQL Server服务帐户。如果是这种情况,那么您至少有三个选项(但可能还有其他选项):
一个。将SQL Server服务设置为以您的身份运行。
湾授予SQL Server服务帐户对该文件夹的显式访问权限。
℃。将文件放在SQL Server可以访问的更合理的位置,或者可以使其具有访问权限(例如C:\bulk\
)。
我建议假设这是一个包含的本地工作站。当我们谈论生产机器时,对SQL Server的本地文件系统访问肯定存在更严重的安全问题,当然,通过使用上面的c.
,这仍然可以在很大程度上减轻这一点,并且只允许服务帐户访问您希望它能够触摸的文件夹。
答案 2 :(得分:3)
我遇到了同样的问题SSIS 2012,解决方案是使用Windows身份验证。我正在与sa用户一起使用SQL身份验证。
答案 3 :(得分:3)
尝试为“MSSQLSERVER”用户(或 Windows服务中的登录为)提供包含CSV和格式文件读取权限的文件夹强>)
答案 4 :(得分:2)
有时这可能是一个虚假的错误消息,尝试使用与运行该进程相同的帐户打开该文件。我在我的环境中遇到了同样的问题,当我打开文件时(使用相同的凭据运行该进程),它说它必须与已知程序相关联,在我这样做后我能够打开它并运行过程没有任何错误。
答案 5 :(得分:2)
答案 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)
这是我解决此问题的方法非常简单:
您的问题已解决。
答案 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)