連結伺服器僅在我在機器上時才有效。我無法在本地電腦上使用它。缺什麼?
我有一些用於監控日誌傳送的查詢。有時我想在不同的伺服器上執行這些查詢。我通常通過連結伺服器來做到這一點。
我有一個名為的伺服器
SQLDEV4-TS
,它有一個連結伺服器MY_SERVER\DEVELOPMENT
ON
SQLDEV4-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; 2. 為您的連結伺服器創建登錄映射。這對於您的本地開發機器可能就足夠了,但是當您在任何情況下儲存憑據時,請記住安全隱患以及適用於您的環境/雇主的任何安全策略。