Sql-Server

連結伺服器僅在我在機器上時才有效。我無法在本地電腦上使用它。缺什麼?

  • June 9, 2021

我有一些用於監控日誌傳送的查詢。有時我想在不同的伺服器上執行這些查詢。我通常通過連結伺服器來做到這一點。

我有一個名為的伺服器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 配置正確,您將收到不同的錯誤。

有幾個可能的修復:

  1. 配置 Kerberos。當您配置伺服器時,這當然是正確的答案。您應該為您建構的每台伺服器執行此操作,但如果您要使用具有 AD 身份驗證的連結伺服器,則**需要執行此操作。**您可以查詢sys.dm_exec_connectionssession_id確認是否正確配置了 Kerberos,或者您是否正在使用 NTLM。

從 sys.dm_exec_connections 中選擇 auth_scheme,其中 session_id=@@spid; 2. 為您的連結伺服器創建登錄映射。這對於您的本地開發機器可能就足夠了,但是當您在任何情況下儲存憑據時,請記住安全隱患以及適用於您的環境/雇主的任何安全策略。

引用自:https://dba.stackexchange.com/questions/293949