7

我正在开发一个将数据批量加载到 SQL Server 2008 数据库中的应用程序。它将 CSV 文件写入网络共享,然后调用包含 BULK INSERT 命令的存储过程。

我正在将应用程序迁移到一个全新的网络。在这个新世界中,批量插入失败并出现以下错误:

Msg 4861, Level 16, State 1, Line 1
Cannot bulk load because the file "\\myserver\share\subfolder\filename" could not be opened. Operating system error code 5(failed to retrieve text for this error. Reason: 15105).

我使用编写文件的同一帐户使用 Windows 身份验证连接到数据库。该文件及其所在的文件夹授予我的用户帐户和数据库服务器的域服务帐户的读取和修改权限。该服务帐户显然已允许受约束的委派,这在MSDN中有所提及。还是不行。如果我使用 SQL Server 帐户进行连接,则批量插入成功,但我们正试图仅使用 Windows 身份验证。

有没有人知道需要做什么才能完成这项工作?SQL Server 究竟如何访问网络共享上的数据,在其服务帐户和连接用户的服务帐户之间跳转?我知道我可以在我们当前的基础架构中在类似的情况下批量插入,但是随着年龄的增长,它变得如此笨拙,以至于很难追踪过去为实现这一点所做的工作。

4

4 回答 4

5

最近,我们的一些开发人员遇到了这个问题。我想出了许多方法来测试批量插入。

我们的首选是使用 SQL 服务帐户。我们将 SQL 服务器和 SQL 代理设置为作为服务帐户运行,然后允许开发人员触发代理作业。服务帐户被授予对 UNC 共享的权限,并且这一切都正常运行。请注意,服务帐户将始终可以正常运行这些代理作业(假设已设置 UNC 权限)。尝试测试的开发人员会遇到这些问题。

另一种方法是在 SQL 服务器本身上创建一个共享并将批量插入路径指向本地目录。这些错误似乎只在访问 UNC 路径时发生。无论 UNC 路径是否具有允许您访问的正确权限。例如,我们C:\test\在 SQL 服务器本身上创建一个文件夹,并允许它允许开发人员将测试文件放在那里。然后通过批量插入命令调用这些。

可能需要对 master 运行命令以允许 SQL 登录组权限批量插入。这是如下。

GRANT ADMINISTER BULK OPERATIONS TO "domain\usergroup"
于 2013-11-05T09:42:11.430 回答
4

应阅读 Adam Saxton 的博客(关于 Kerberos 和共享中的批量插入):http: //blogs.msdn.com/b/psssql/archive/2012/09/07/bulk-insert-and-kerberos.aspx。Adam 提供了两种方法:为机器(相对于 sqlservr.exe 启动)帐户启用约束委派,或者使用 SQL Server 登录。Adam 提到了另外两种方法(他不推荐)。

顺便说一句,OP 消息的后半部分“(无法检索此错误的文本。原因:15105)”可能与 SQL Server 启动帐户缺乏 SQL Server 的“配置 Windows 服务帐户和权限”主题中记录的权限有关,例如 SeAssignPrimaryTokenPrivilege。

于 2015-08-11T22:17:49.473 回答
1

你有没有解决过这个问题?我最近遇到了类似的问题,发现解决它的最好方法是使用 SQL 登录。

最初,在阅读了此处的注释后,我想如果我只是授予我连接到 SQL Server 的 Windows 帐户的读取权限,那就没问题了,但即使我授予对 的读取权限Everyone,我仍然无法读取文件。

我认为原因与 SQL Server 模拟 Windows 用户并尝试访问 UNC 共享有关,这是委派,除非明确启用,否则不允许这样做。这里有一些注释可能会有所帮助。这是您所说的受限代表团,我也无法让它发挥作用!

底线:我刚刚使用了 SQL 登录并确保 SQL Server 进程帐户对共享具有读取权限(Everyone在我的情况下通过授予读取权限)并且它有效。

于 2012-10-02T08:47:51.880 回答
1

为了使用 AD 用户批量插入,它自己的 SQL 服务必须作为域用户运行,并且必须具有 AD 权限才能委托身份验证。如果您想与广告用户一起运行链接服务器,则相同。这是AD和链接服务器的链接,但权限相同。

链接服务器和 Active Directory

  • 服务器必须具有域管理员注册的 SPN。
  • 必须信任运行 SQL Server 的帐户才能进行委派。
  • 服务器必须使用 TCP/IP 或命名管道网络连接。
于 2015-08-03T18:51:17.830 回答