Создание связанного сервера, который указывает на себя

14

Я пытаюсь создать связанный сервер на экземпляре SQL Server 2014, servername\instancenameиспользуя следующий вызов:

EXEC master.dbo.sp_addlinkedserver 
    @server = N'servername\instancename',
    @srvproduct=N'SQL Server'

Я получаю ошибку:

Msg 15028, Level 16, State 1, Procedure sp_addlinkedserver, Line 82
The server 'servername\instancename' already exists.

Это прекрасно работает в SQL Server 2005, и в соответствии с MSDN ,

Связанный сервер не обязательно должен быть другим экземпляром SQL Server,

Так что я не уверен, что изменилось в последних версиях, которые запрещают это. Использование пользовательского интерфейса создает похожее сообщение:

Вы не можете создать локальный SQL Server как связанный сервер.

Я понимаю, что запрашивать это странно, но поддерживать некоторый унаследованный код, который работал в 2005 году (и раньше использовался в отдельных случаях). В документации говорится, что это должно работать, но это не так. Есть ли способ заставить это работать в 2014 году, или мне придется изменить базовый код?

mathewb
источник
1
На самом деле это даже не должно иметь значения. Вы можете просто использовать 4-х частный идентификатор на локальном сервере.
Крис Груттемейер
Почему вы пытаетесь создать связанный сервер с локальным сервером? Какая часть не работает? Может быть, именно об этом должен быть ваш вопрос ...
Аарон Бертран
1
Устаревший код был написан для разных экземпляров, подключающихся через связанный сервер. В какой-то момент в истории два экземпляра были объединены в один экземпляр, но код и связанный сервер остались без изменений. Моя цель состоит в том, чтобы поддерживать код как есть, потому что а) я не знаю, что требуется для его изменения, и б) основной разработчик хочет иметь возможность поддерживать базы данных, распространяемые по отдельным экземплярам в будущем.
Mathewb
3
Возможно, вы захотите рассмотреть синонимы. Затем, если у вас есть объекты, перемещенные на разные серверы, вы просто удаляете и заново создаете синонимы, и вам не нужно прикасаться к коду.
Аарон Бертран
Спасибо Аарон. Я думаю, что это именно то, что я искал. Одна база данных использует синонимы, поэтому мне просто нужно удалить / создать их, удалив имя сервера из четырех частей имени. Тогда я могу полностью удалить связанный сервер. Если позже база данных будет перемещена, я могу добавить имя связанного сервера обратно в синонимы. Понял.
Mathewb

Ответы:

20

Оказывается, я смог заставить его работать с другими параметрами.

EXEC master.dbo.sp_addlinkedserver
    @server = N'LinkedServerName', 
    @srvproduct=N'', 
    @provider=N'SQLNCLI', 
    @provstr=N'DRIVER={SQL Server};Server=(local)\InstanceName; Initial Catalog=DBNAME;uid=user;pwd=password;'
mathewb
источник
11

Вместо того, чтобы иметь дело со ссылками на связанный сервер внутри вашего кода, вы можете рассмотреть возможность однократного вложения кода, связанного с использованием синонима в любом месте, где в данный момент у вас есть связанный сервер.

Так что вместо:

SELECT whatever FROM someserver.somedb.dbo.mytable;

У вас есть синоним:

CREATE SYNONYM dbo.mytablepointer FOR someserver.somedb.dbo.mytable;

Тогда ваш код просто:

SELECT whatever FROM dbo.mytablepointer;

Затем, если у вас есть объекты, перемещенные на разные серверы, вы просто удаляете и заново создаете синонимы, и вам не нужно трогать код:

DROP SYNONYM dbo.mytablepointer;
CREATE SYNONYM dbo.mytablepointer FOR otherserver.somedb.dbo.mytable;
Аарон Бертран
источник
3

Запустите эту команду - вы сможете использовать локальный сервер в качестве связанного сервера без необходимости изменения кода

EXEC sp_addlinkedserver @server = 'LinkedServerName',
                        @provider ='SQLNCLI',
                        @datasrc ='LocalServerName',
                        @srvproduct = 'SQL'
Ашиш Нигам
источник