为BULK INSERT配置不受约束的委托


12

我在Always On可用性组中有一对Microsoft SQL Server 2016节点。我正在尝试对BULK INSERTWindows Server 2016文件服务器故障转移群集上的文件执行(使用SQL Server 2016 Management Studio查询),但是出现以下错误:

消息4861,级别16,状态1
无法批量加载,因为无法打开文件“ \ nas2.my.domain \ Microsoft SQL Server 2016 Enterprise \ test.txt”。操作系统错误代码5(访问被拒绝。)。

无论我使用活动节点名称(nas2.my.domain)还是故障转移群集侦听器(nas.my.domain),都会发生这种情况。

环顾四周后,我发现这是由于SQL Server无法模拟与我连接的用户帐户所致BULK INSERT

如果使用Windows身份验证连接到SQL Server,则SQL Server服务帐户将在连接到文件服务器时尝试模拟您的用户帐户。如果使用SQL Server身份验证进行连接,它将以SQL Server服务帐户连接到文件服务器。

如果未正确配置委派和模拟(默认状态),则SQL Server服务将无法模拟您的用户帐户,并且将退回尝试以匿名用户身份连接到文件服务器。

可以通过查看文件服务器上的安全事件日志来确认。这些事实以及有关配置不受约束和受约束的委派的指南记录在以下链接中:

我已经尝试按照thesqldude指南中的说明进行操作,但是仍然无法正常工作。

我尝试访问的数据库BULK INSERT不是可用性组的一部分,因此只有MSSQL1节点才有意义。文件服务器在NAS2节点上处于活动状态。检查文件服务器上的事件日志确实表明它仍然遇到此问题,并且SQL Server尝试以匿名用户身份验证文件服务器,而不是模拟我的用户帐户。

有人知道出什么事了吗?还是为了使这些指南过时而在SQL Server 2016中进行了某些更改?

我可以确认已通过将该GPO应用于MSSQL1 gpresult.exe /R,并且随后重新启动了SQL和File Server节点,以确保刷新了所有缓存。


1
两个问题:1)您是否尝试为您的个人Windows域帐户启用“委派”功能?,2)通过SSMS连接到SQL Server时,您是否登录到运行SQL Server并在本地连接的服务器(即,远程桌面),或登录到您的工作站并远程连接到SQL Server?如果您尚未尝试直接登录服务器并通过SSMS在本地连接,请尝试这样做。如果您尚未尝试启用域帐户的委派功能,请尝试一下。
所罗门·鲁兹基

Answers:


1

您的配置看起来很可靠。SPN和委派已按我自己的方式进行配置。

您唯一需要说明的就是文件/共享权限。这是我的解决方案介入的地方。

解决方案1(个人帐户)

  1. 验证是否允许您的个人帐户访问文件服务器共享上的文件
    • 您的个人帐户至少需要在共享权限级别具有读取权限,或者在大多数情况下,您可能会看到每个人都具有读取权限。
    • 您的个人帐户至少需要文件权限级别的READ权限
    • 在该文件级别的文件级别检查权限继承
      • 更改文件权限后重新启动SQL Server或循环SQL Server服务。
    • 或者:用您的个人帐户登录到SQL Server,然后连接到共享并打开文件。
  2. 您的个人帐户打开SSMS 。
  3. 使用Windows身份验证打开与SQL Server实例的连接。
    • 验证您是否已使用之前使用过的脚本通过SQL Server服务帐户连接到实例。
  4. 使用BULK INSERT执行导入

解决方案2(SQL Server服务帐户)

  1. 验证是否允许SQL Server服务帐户访问文件服务器共享上的文件
    • SQL Server服务至少读权限帐户需要在共享权限级别或在大多数情况下,你可能会看到,每个人都有读取权限。
    • SQL Server服务至少读权限帐户需要在文件的权限级别
    • 在该文件级别的文件级别检查权限继承
      • 更改文件权限后重新启动SQL Server或循环SQL Server服务。
    • 或者:使用SQL Server服务帐户登录到SQL Server,然后连接到共享并打开文件。
  2. 使用SQL Server服务帐户打开SSMS 。
    • 运算符your_domain \ SQL_Server_service_account
    • 提供密码
  3. 使用Windows身份验证打开与SQL Server的连接。
    • 验证您是否已使用之前使用过的脚本通过SQL Server服务帐户连接到实例。
  4. 使用BULK INSERT执行导入

批量插入权限

安全帐户委派(模拟)

如果用户使用SQL Server登录名,则使用SQL Server进程帐户的安全配置文件。使用SQL Server身份验证的登录不能在数据库引擎外部进行身份验证。因此,当使用SQL Server身份验证通过登录启动BULK INSERT命令时,将使用SQL Server进程帐户(SQL Server数据库引擎服务使用帐户)的安全上下文建立与数据的连接。若要成功读取源数据,必须授予SQL Server数据库引擎使用的帐户访问源数据的权限。相反,如果SQL Server用户使用Windows身份验证登录,则该用户只能读取该用户帐户可以访问的文件, 不管SQL Server进程的安全配置文件如何。

参考:批量插入(Transact-SQL)


0

以我的委派经验,SQL Server服务帐户需要适当的权限才能代表它尝试访问的共享。您是否调整了这些权限?我认为只读就足够了。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.