Sql-Server

無法使用主機文件中的名稱連接到連結伺服器

  • August 1, 2022

我正在嘗試使用正在設置連結伺服器的伺服器上的本地 Windows 主機文件在 SQL Server 2017 中設置連結伺服器。這樣做的原因是允許我對連結伺服器名稱進行硬編碼,但通過更改本地主機文件來配置它指向的伺服器。

我在兩個數據庫伺服器上都使用 Windows 身份驗證。我可以訪問兩者。

當我創建一個引用 IP 地址的連結伺服器時,它可以工作。我可以連接和查詢範例表。

EXEC sp_addlinkedserver @server = '192.168.1.109'
, @srvproduct = 'SQL Server'

當我將以下行添加到主機文件時,上面創建的通過 IP 地址連接的連結伺服器不再工作。

192.168.1.109 主機文件測試

我收到以下錯誤:

Msg 18456, Level 14, State 1, Line 18
Login failed for user 'NT AUTHORITY\ANONYMOUS LOGON'.

通常我會認為這與缺少 SPN 有關,但是在這種情況下,兩台伺服器都設置了 SPN,如果我再次從主機文件中刪除上述行,我可以連接。

此外,如果我嘗試使用主機文件中的名稱設置另一個連結伺服器,就像這樣,它也會失敗,並出現同樣的錯誤。

EXEC sp_addlinkedserver @server = 'hostsfiletest'
, @srvproduct = 'SQL Server'

我不確定我哪裡出錯了。

我可以從我正在設置連結伺服器的伺服器 ping 目標伺服器,並且我可以使用 hostsfiletest 作為實例名稱從同一台伺服器連接到目標 SQL 實例,因此主機文件中的行顯然在做某事。當我從主機文件中刪除該行時,我無法使用 hostsfiletest 作為實例名稱進行連接。

作為另一個測試,當我將與上面相同的行放入筆記型電腦的本地主機文件時,我能夠使用 hostsfiletest 作為伺服器名稱連接到 SSMS 中的目標伺服器。

如有任何幫助,我將不勝感激。如果有更簡單的方法來設置指向可配置位置的連結伺服器,我也願意接受其他實現相同目標的方法。

通常我會認為這與缺少 SPN 有關

是的。Kerberos SPN 取決於您用於連接的主機名。如果您連接到名為SomeServer.foo.bar服務帳戶的主機,則在執行遠端 SQL Server 時必須具有用於MSSQLSvc\SomeServer.foo.bar. 這與以下場景基本相同:如何為 SQL Server 實例添加主機名別名

您可以更新您使用的OleDb 提供程序,並同時將連結伺服器名稱與 SQL Server 名稱分離,如下所示:

USE [master]
GO
EXEC master.dbo.sp_addlinkedserver @server = N'MYLINKEDSERVER', 
                                  @srvproduct=N'SQL', 
                                  @provider=N'MSOLEDBSQL', 
                                  @datasrc=N'Someserver.foo.bar', 
                                  @catalog=N'MASTER'

GO
EXEC master.dbo.sp_serveroption @server=N'MYLINKEDSERVER', 
                               @optname=N'rpc out', 
                               @optvalue=N'true'
GO
EXEC master.dbo.sp_addlinkedsrvlogin @rmtsrvname = N'MYLINKEDSERVER', 
                                    @locallogin = NULL , 
                                    @useself = N'True'
GO
exec ('select 1 a') at MYLINKEDSERVER

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