Створення пов'язаного сервера, який вказує на себе


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 році, або мені доведеться змінити базовий код?


1
Це насправді навіть не повинно змінити значення. Ви можете просто використовувати 4-частинний ідентифікатор на локальному сервері.
Kris Gruttemeyer

Чому ви намагаєтесь створити зв'язаний сервер з локальним сервером? Яка частина не працює? Можливо, саме про це має бути ваше питання ...
Аарон Бертран

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;'

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'
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.