Вопрос:
Я собираюсь обновить свой экземпляр SQL Server 2012 до SQL Server 2014.
Я клонировал главную виртуальную машину Windows и переименовал ее с foo-2012 на foo-2014. При перезапуске экземпляр SQL Server заметил это как обновленное собственное имя, поэтому теперь я могу войти в него как foo-2014. Все хорошо.
К сожалению, запись (single) в sys.servers по-прежнему foo-2012 что означает, что выполняется
SELECT * FROM [foo-2012].[barDB].[dbo].tFooBarTable
не удается:
Не удалось найти сервер RW-DB-2014 в sys.servers. Убедитесь, что указано правильное имя сервера. Если необходимо, выполните хранимую процедуру sp_addlinkedserver, чтобы добавить сервер в sys.servers.
Хорошо.
Я запускаю EXEC sp_addlinkedserver ‘foo-2014’, ‘SQL Server’ и получаю запись.
Но теперь новая запись имеет isLinked=1 (тогда как существующая запись имеет isLinked=0).
Документация указывает, что эта настройка важна (особенно для моего приложения, которое имеет очень сильные мнения относительно Distr.Trans. :()
Я не могу напрямую редактировать/добавлять/изменять sys.servers. Любая попытка сделать это дает:
Специальные обновления для системных каталогов запрещены.
Я EXEC sp_dropserver ‘foo-2014’ новую запись (EXEC sp_dropserver ‘foo-2014’), которая преуспевает, и попробуйте использовать EXEC sp_addserver ‘foo-2014’, ‘local’ который сообщает
Сервер “foo-2014” уже существует
Немедленно перезапустите кадр, затем откройте
Сервер “RW-DB-2014” не существует. Используйте sp_helpserver для отображения доступных серверов.
Как это исправить?
Лучший ответ:
Вам нужно сначала удалить старый сервер foo-2012 чтобы у вас не было строк в sys.servers, а затем добавьте ‘local’:
EXEC sp_dropserver ‘foo-2012’; GO EXEC sp_addserver ‘foo-2014’, ‘local’; GO
Затем вам нужно будет перезапустить службу MSSQLSERVER, чтобы это изменение вступило в силу, согласно документации для sp_addserver:
Локальное определение вступает в силу только после перезапуска Database Engine.