Sql-Server

虛擬機複製後無法更改伺服器名稱

  • October 24, 2016

由於我無法控制的原因,我必須找到解決此問題的方法。簡單地重新安裝實例不是一種選擇。在 sys.servers 中顯示為 server_id 0 的伺服器名稱仍顯示舊的伺服器名稱。

執行以下命令時出現錯誤:

sp_dropserver 'OLD_INSTANCE'
GO
sp_addserver 'NEW_INSTANCE', Local
GO 

錯誤資訊:

消息 15190,級別 16,狀態 1,過程 sp_dropserver,第 67 行

伺服器“OLD_INSTANCE”仍有遠端登錄或連結登錄。

消息 15028,級別 16,狀態 1,過程 sp_addserver,第 87 行

伺服器“NEW_INSTANCE”已經存在。

最奇怪的是,遠端登錄是“空”登錄。

exec sp_dropremotelogin @remoteserver = 'OLD_INSTANCE'
go

錯誤資訊:

消息 15185,級別 16,狀態 1,過程 sp_dropremotelogin,第 70 行

沒有從遠端伺服器 ‘OLD_INSTANCE’ 映射到本地使用者 ‘(null)’ 的遠端使用者 ‘(null)’。

舊實例不存在登錄名。

sp_helpremotelogin 'OLD_INSTANCE'

消息 15201,級別 16,狀態 1,過程 sp_helpremotelogin,第 37 行

遠端伺服器“OLD_INSTANCE”沒有遠端登錄。

如果我無法刪除不存在的登錄名,如何重命名此實例?有沒有辦法刷新登錄名?

您需要同時檢查sys.remote_loginssys.linked_logins。您應該能夠動態建構腳本以刪除您找到的集合:

DECLARE @sql NVARCHAR(MAX) = N'';

SELECT @sql += N'EXEC sys.sp_droplinkedsrvlogin @s, N''' + remote_name + N''''
 FROM sys.linked_logins
 WHERE server_id = 0 AND remote_name IS NOT NULL;

SELECT @sql += N'EXEC sys.sp_dropremotelogin @s, N''' + remote_name + N''''
 FROM sys.remote_logins
 WHERE server_id = 0 AND remote_name IS NOT NULL;

PRINT @sql; -- spot check will only show first 8K of command

DECLARE @s NVARCHAR(512) = N'old server name';
--EXEC sys.sp_executesql @sql, N'@s NVARCHAR(512)', N'.\SQL2014';

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