在以下情况下尝试批量插入 SQL 时遇到问题:
- 在工作站 A 上运行管理工作室
- 在服务器 B 上运行的 SQL
- 批量上传的文件位于服务器 C
每当我尝试批量上传时都会收到错误
Cannot bulk load because the file <filename> could not be opened. Operating system error code 5(Access is denied.).
现在我知道我们这里有一个双跳问题,需要解决委派问题。已为 SQL 设置了 SPN,如下所示(SQL 在不同的端口上运行)。SQL 以域用户身份运行,并且 SPN 位于该帐户上。
command: setspn -l domain\sqluser
result:
MSSQLSvc/WIN-D04V1IOTESN
MSSQLSvc/WIN-D04V1IOTESN.domain.local
MSSQLSvc/win-d04v1iotesn.domain.local:55037
MSSQLSvc/WIN-D04V1IOTESN:55037
我还设置了从 SQL 用户帐户到 Cifs 和 HOST 文件服务器的委派,但无济于事。
我已启用 Kerberos 日志记录并在事件查看器中看到以下事件:
A Kerberos Error Message was received:
on logon session
Client Time:
Server Time: 14:44:10.0000 8/9/2011 Z
Error Code: 0xe KDC_ERR_ETYPE_NOTSUPP
Extended Error:
Client Realm:
Client Name:
Server Realm: domain.LOCAL
Server Name: krbtgt/domain.LOCAL
Target Name: krbtgt/[email protected]
Error Text:
File: 9
Line: efb
Error Data is in record data.
那么,您对我在这里遗漏了什么有什么想法吗?我以前也曾进行过这种委派工作,但总是在默认端口上使用 SQL,这会产生影响吗?
编辑
我现在除了第一个错误之外还看到了这个 Kerbors 错误:
A Kerberos Error Message was received:
on logon session
Client Time:
Server Time: 15:4:10.0000 8/9/2011 Z
Error Code: 0xe KDC_ERR_ETYPE_NOTSUPP
Extended Error:
Client Realm:
Client Name:
Server Realm: domain.LOCAL
Server Name: krbtgt/domain.LOCAL
Target Name: krbtgt/[email protected]
Error Text:
File: 9
Line: efb
Error Data is in record data.
答案1
从评论中可以看出,您使用域登录连接到 SQL,因此 SQL 在连接到文件共享时试图冒充您。如果您没有为您的域帐户设置委派,则它会失败。
当运行作为 SQL 登录连接的存储过程时,SQL 将尝试使用其正在运行的域服务帐户,您说您已经为此设置了委派。
如果您使用域服务帐户连接查询窗口,则 SQL 正在运行,因为它应该可以工作,因为该委派已配置。为您自己的域帐户设置对文件服务器的委派信任,它应该开始工作。
答案2
对于 SQL Server,SPN 看起来是正确的。是否为文件服务器注册了正确的 SPN?
另一个可能使 SQL Server 的 Kerberos 身份验证陷入混乱的因素是 DNS 问题。我读到过,sql 客户端将对服务器地址进行反向 DNS 查找,并使用该名称来形成 SPN。
我知道您已经完成了许多步骤,但这应该是您需要做的所有事情。
确保 DNS 解析对 SQL 服务器和文件服务器都正常工作。
为 SQL 服务器注册 SPN。确保没有重复的 SPN。SQL 2008 中的 setspn 可以为您执行此检查。
为文件服务器注册 SPN。确保没有重复的 SPN。
在 SQL Server 服务帐户上启用“信任委派”。
还要检查您的帐户是否未标记为不可委派。(这是一个词吗?)
如果无法使其工作,则可以设置 SQL Agent 作业来取消批量插入。然后它将在您配置作业以使用的帐户下运行。
答案3
错误消息中缺少客户端时间,这让我很怀疑。如果客户端时间和服务器上的时间相差太大,Kerberos 身份验证就会失败。(我一直不确定“相差太大”到底是什么意思。我知道一分钟就可以了,因为我们昨天在新服务器上又遇到了这个问题。)
当 Kerberos 身份验证失败时,SSMS 可能仍会连接,但它会默默地恢复使用 NTLM 身份验证。
您可以通过调整连接设置和字符串来强制使用 kerberos,这样如果使用 kerberos 身份验证,连接将严重失败,但有一种更简单的方法可以查看您是否使用 kerberos 进行连接。要确保您使用 Kerberos 身份验证进行连接,请通过 SSMS 正常连接并在 SSMS 查询窗口中运行此操作:
从 master.sys.dm_exec_connections 中选择 auth_scheme,其中 session_id=@@spid
您应该会看到“KERBEROS”。如果没有,您可能会看到“NTLM”,然后您就会知道出了问题。