Как переименовать компьютер с SQL Server

добавлено: 13 янв 11
понравилось:0
просмотров: 12513
комментов: 2

теги:

Автор: DeColo®es

В процессе подготовки очередной виртуальной машины для доклада по разработке CLR процедур, обратил внимание, что имя для машины было "сгенерировано" не очень подходящее - WIN-K49RLP2MADZ.
Бывают и другие ситуации, когда нужно изменить имя сервера - например, если нужно заменить один сервер другим и при этом очень желательно оставить старое имя, чтобы не перенастраивать клиентские приложения, установленные на множестве компьютеров пользователей.
Но просто изменить имя Windows-машины недостаточно

Дело в том, что SQL Server "запоминает" имя компьютера, на который он установлен.
Для примера возьмем компьютер с SQL Server 2008R2 в полной установке.
Все службы настроены на запуск под пользователем "123", административный доступ предоставлен пользователю "Administrator" и группе "Administrators".
Сразу после установки SQL Server, системные функции возврашают правильное имя компьютера:
select @@servername as [@@servername], SERVERPROPERTY('ServerName') as [SERVERPROPERTY], SUSER_SNAME() as [SUSER]
@@servernameSERVERPROPERTYSUSER
WIN-K49RLP2MADZWIN-K49RLP2MADZWIN-K49RLP2MADZ\Administrator


После переименования компьютера в "DEV2010" и перезагрузки, результат будет... несколько неожиданным:
@@servernameSERVERPROPERTYSUSER
WIN-K49RLP2MADZDEV2010DEV2010\Administrator

При этом имена логинов, содержащие имя компьютера, не изменились:
select name
from sys.server_principals
where type in ('U', 'G')
and name not like 'NT %'
order by name

Выполним рекомендованные для такого случая в документации команды удаления и создания локального сервера:
sp_dropserver 'WIN-K49RLP2MADZ'
GO
sp_addserver 'DEV2010', local
GO
, перезапустим службу и проверим результат:
@@servernameSERVERPROPERTYSUSER
DEV2010DEV2010DEV2010\Administrator

Но имена логинов остались прежними и их очень желательно переименовать. Из интерфейса SSMS или командой alter login - разницы нет:
alter login [WIN-K49RLP2MADZ\123] with name = [DEV2010\123]
alter login [WIN-K49RLP2MADZ\Administrator] with name = [DEV2010\Administrator]

Если у нас просто только что установленный SQL Server в минимальной конфигурации, то на этом можно закончить.
(Хотя в этом случае лучше просто переустановить сервер после переименования машины.)
В моем случае был установлен также ReportServer и возникло предположение, что в его базах данных (ReportServer & ReportServerTempDB) или где-то еще могут остаться "воспоминания" о старом имени машины.

Для поиска старого имени в базах данных воспользуемся скриптом:
declare 
	@collist varchar(max),
	@srch_sql varchar(max),
	@object_id int,
	@schemaName varchar(128),
	@tableName varchar(128)

declare curs cursor local static forward_only for 
select distinct OBJECT_SCHEMA_NAME(c.object_id), OBJECT_NAME(c.object_id), c.object_id
from sys.all_columns c
where (objectproperty(c.object_id, 'IsTable') = 1
	or (objectproperty(c.object_id, 'IsView') = 1
		and OBJECT_SCHEMA_NAME(c.object_id) = N'sys'))
and not (
	OBJECT_SCHEMA_NAME(c.object_id) = N'sys'
	and	(OBJECT_NAME(c.object_id) like N'sys%'
	or OBJECT_NAME(c.object_id) like N'dm[_]db%'
	or OBJECT_NAME(c.object_id) like N'dm[_]repl%'
	or OBJECT_NAME(c.object_id) like N'filestream[_]t%'
	or OBJECT_NAME(c.object_id) like N'spatial%'))
order by 1,2
open curs
while 1=1
begin

	fetch next from curs into @schemaName, @tableName, @object_id
	if @@FETCH_STATUS <> 0 break

	set	@collist = convert(varchar(max),(
		select 'or upper(convert(varchar(8000), ' + c.name + ' )) like ''%WIN-K49RLP2MADZ%'' '
		from sys.all_columns c
		where c.object_id = @object_id
		and c.system_type_id in(175, 99, 239, 231, 167, 35)
		and c.max_length >=16
		for xml path('')))
	set @srch_sql = 'if exists(select * from '+@schemaName+'.'+@tableName+' with(nolock) where 1=0
	'+@collist+')
	raiserror('''+@schemaName+'.'+@tableName+' - found!'', 10, 1) with nowait'
	begin try
		exec(@srch_sql)
	end try
	begin catch
		print('Error searching in '+@schemaName+'.'+@tableName)
	end catch
end
В базах данных master, tempdb, msdb, ReportServer, ReportServerTempDB старое название было найдено .
Старое имя присутствует, как часть имени пользователя, созданного на основе Windows-логина, под которым происходила установка SQL Server.
Также для этого по умолчанию создается схема, в имени которой присутствует имя компьютера.

Пользователей можно просто переименовать - скриптом или из интерфейса SSMS.
Например:
alter user [WIN-K49RLP2MADZ\123] with name=[DEV2010\123]
Схемы для таких пользователей как правило не используются в принципе, поэтому их оставим, как есть.

Также имя компьютера фигурирует в таблице ReportServer.dbo.Keys.

Чуть подробнее о Report Server...

В утилите Reporting Services Configuration Manager нужно для используемой базы данных указать новое имя сервера.
Значение в таблице ReportServer.dbo.Keys будет при этом изменено.

Далее - в реестре меняем имя компьютера на новое в ключах:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\90\Machines\OriginalMachineName
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\100\Machines\OriginalMachineName

Если есть желание, то можно переименовать все локальные группы в Local Users and Groups, которые начинаются с "SQLServer" и содержат старое имя компьютера
И соответственно - исправить значения в реестре:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\Services\Report Server\GroupPrefix
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\Services\SSIS Server\GroupPrefix

Ну вот вроде бы и всё.
Конечно, для реальных приложений возможно потребуется вносить еще какие-то изменения.
Например, если настроена репликация, то.... проще перенастроить ее заново, возможно - предварительно создав скрипты в SSMS.
Ну и главное - без практического опыта лучше не рваться в бой и переименовывать "боевой" сервер, а потренироваться сначала на аналогичном тестовом сервере. Например, на виртуальном.

Комментарии


  • Дополню старой статьёй с этого сайта: https://www.sql.ru/articles/mssql/01080304RenamingSQLServer.shtml



Необходимо войти на сайт, чтобы оставлять комментарии