我有一些用于监控日志传送的查询。有时我想在不同的服务器上运行这些查询。我通常通过链接服务器来做到这一点。
我有一个名为的服务器SQLDEV4-TS
,它有一个链接服务器MY_SERVER\DEVELOPMENT
ONSQLDEV4-TS
我已经按照下图设置了Kerberos :
我在下面有这个查询,我用它来测试与链接服务器的连接。
DECLARE @server_name sysname = @@servername
SELECT @server_name=N'MY_SERVER\DEVELOPMENT'
DECLARE @sql NVARCHAR(MAX) = N'SELECT * FROM OPENQUERY([' + @server_name +'],
''SELECT ''''Radhe'''' AS Radhe'');'
BEGIN TRY
EXEC sp_testlinkedserver @server_name
EXEC sp_executesql @sql=@sql
END TRY
BEGIN CATCH
SELECT [error_number]=ERROR_NUMBER(), [error_message]=ERROR_MESSAGE();
END CATCH;
PRINT 'We got past the Catch block!';
当我在服务器本身 - SQLDEV4-TS
- 我运行上面的脚本时,我得到以下结果:
一切都好 - 它按预期工作 - 没问题。
但是,当我SQLDEV4-TS
从本地机器连接并运行脚本(在我的机器上)时,我得到以下结果:
用户“NT AUTHORITY\ANONYMOUS LOGON”登录失败。
这个链接服务器设置中缺少什么,我必须在机器上才能工作?
这是 Kerberos 身份验证的问题。
您正在自己的笔记本电脑上连接到 SQL Server,但该服务在与您的 SSMS 会话不同的进程和帐户下运行。然后,该 SQL Server 实例需要跨链接服务器进行连接。这是从 SSMS 到 SQL Server 的一个跃点,然后是到第二个 SQL Server 实例的第二个跃点。
执行“第二跳”将要求您使用 Kerberos。默认情况下,您使用 NTLM 进行 Windows/AD 身份验证。Kerberos 更安全,并且具有更好的域级控制。当您使用 NTLM 进行第二次跃点时,您的 SQL Server 服务无法进一步传递您的凭据,而是通过
NT AUTHORITY\ANONYMOUS LOGON
. 如果 Kerberos 配置正确,您将收到不同的错误。有几个可能的修复:
配置 Kerberos。当您配置服务器时,这当然是正确的答案。您应该为您构建的每台服务器执行此操作,但如果您要使用具有 AD 身份验证的链接服务器,则需要执行此操作。您可以查询
sys.dm_exec_connections
以session_id
确认是否正确配置了 Kerberos,或者您是否正在使用 NTLM。从 sys.dm_exec_connections 中选择 auth_scheme,其中 session_id=@@spid;
为您的链接服务器创建登录映射。这对于您的本地开发机器可能就足够了,但是当您在任何情况下存储凭据时,请记住安全隐患以及适用于您的环境/雇主的任何安全策略。