![使用来自不同服务器的链接 SQL 服务器](https://linux22.com/image/662915/%E4%BD%BF%E7%94%A8%E6%9D%A5%E8%87%AA%E4%B8%8D%E5%90%8C%E6%9C%8D%E5%8A%A1%E5%99%A8%E7%9A%84%E9%93%BE%E6%8E%A5%20SQL%20%E6%9C%8D%E5%8A%A1%E5%99%A8.png)
我有 3 台机器参与运行 SQL 脚本:
- JumpBox——一种作为自动化运行稳定点的机器。
- ReportBox - 保存报告数据库和逻辑的机器。运行 SQL Server 2008 R2
- OLTPBox - 包含 OLTP 数据库的机器。运行 SQL Server 2014
由于 OLTPBox 是一个不稳定的测试环境(它会定期被拆除并重建),因此我们需要在该环境之外做尽可能多的工作。因此,我有一个 SQL 脚本(称之为InsertScript.sql
),它基本上执行以下操作:
INSERT INTO testresults VALUES (SELECT * from OLTPBox.prod.dbo.results)
脚本中的 OLTPBox 是一个链接服务器。
上述脚本包装在 JumpBox 上运行的 SQLCMD 调用中:
SQLCMD -i .\InsertScript.sql -S ReportBox -D Reporting
但是当我运行它时,出现以下错误:
Msg 18456, Level 14, State 1, Server OLTPBox, Line 1 Login failed for user 'NT AUTHORITY\ANONYMOUS LOGON'.
我在 JumpBox 上运行的上下文作为所有相应数据库和所有 3 台服务器的 DBO 存在,因此我不确定为什么在尝试使用链接服务器时会丢失上下文。这三台机器都在同一个域中,实际上甚至在同一个子网中(因此它们使用同一个 DC 进行身份验证)。
这是怎么回事?为什么登录上下文丢失了?
答案1
确保在所有涉及的 SQL Server 上设置了 SPN。
我通常会做以下事情:
setspn –A MSSQLSvc/myservername.fqdn:instancename DOMAIN\SQLServiceAccount
setspn –A MSSQLSvc/myservername.fqdn:port DOMAIN\SQLServiceAccount
setspn –A MSSQLSvc/myservername:instancename DOMAIN\SQLServiceAccount
setspn –A MSSQLSvc/myservername:port DOMAIN\SQLServiceAccount
这应该可以捕捉到大多数可能的连接方式
您可以通过查看表格来检查它是否正常工作sys.dm_exec_connections
。查找Kerberos
下面的auth_scheme
。它可能需要几分钟才能启动,如果没有,请尝试重新启动连接到 SQL 的服务。