Tworzenie połączonego serwera, który wskazuje na siebie

14

Usiłuję utworzyć serwer połączony w wystąpieniu programu SQL Server 2014 servername\instancenameza pomocą następującego wywołania:

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

Pojawia się błąd:

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

Działa to dobrze w SQL Server 2005 i zgodnie z MSDN ,

Połączony serwer nie musi być kolejną instancją SQL Server,

Nie jestem więc pewien, co zmieniło się w ostatnich wersjach, które to uniemożliwiają. Korzystanie z interfejsu użytkownika generuje podobny komunikat:

Nie można utworzyć lokalnego serwera SQL jako serwera połączonego.

Rozumiem, że prośba jest dziwna, ale obsługuje stary kod, który działał w 2005 roku (i był w osobnych instancjach). Dokumentacja mówi, że to powinno działać, ale nie działa. Czy istnieje sposób, aby to zadziałało w 2014 roku, czy też będę musiał zmodyfikować kod źródłowy?

mathewb
źródło
1
To nie powinno nawet mieć znaczenia. Możesz użyć 4-częściowego identyfikatora na serwerze lokalnym.
Kris Gruttemeyer
Dlaczego próbujesz utworzyć serwer połączony z serwerem lokalnym? Która część nie działa? Może właśnie o to powinno chodzić twoje pytanie ...
Aaron Bertrand
1
Starszy kod został napisany dla różnych instancji łączących się przez połączony serwer. W pewnym momencie historii dwa wystąpienia zostały połączone w jedno wystąpienie, ale kod i połączony serwer pozostały niezmienione. Moim celem jest obsługa kodu w stanie, w jakim się znajduje, ponieważ a) nie wiem, co wiąże się z jego zmianą, oraz b) główny programista chce mieć możliwość obsługi baz danych dystrybuowanych w oddzielnych instancjach w przyszłości.
mathewb,
3
Możesz rozważyć synonimy. Następnie, jeśli obiekty zostały przeniesione na różne serwery, po prostu upuszczasz i ponownie tworzysz synonimy i nie musisz dotykać kodu.
Aaron Bertrand
Dzięki Aaron. Myślę, że dokładnie tego szukałem. Jedna baza danych używa synonimów, więc po prostu muszę je upuścić / utworzyć, usuwając nazwę serwera z nazwy czteroczęściowej. Następnie mogę całkowicie wyeliminować połączony serwer. Jeśli baza danych zostanie później przeniesiona, mogę dodać nazwę połączonego serwera z powrotem do synonimów. Rozumiem.
mathewb

Odpowiedzi:

20

Okazuje się, że udało mi się sprawić, by działał z różnymi parametrami.

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
źródło
11

Zamiast zajmować się odniesieniami do serwerów połączonych w kodzie, warto rozważyć jednorazową inwestycję w kod, polegającą na użyciu synonimu w dowolnym miejscu, w którym aktualnie masz połączony serwer.

Więc zamiast:

SELECT whatever FROM someserver.somedb.dbo.mytable;

Masz synonim:

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

Zatem twój kod jest po prostu:

SELECT whatever FROM dbo.mytablepointer;

Następnie, jeśli obiekty zostały przeniesione na różne serwery, po prostu upuszczasz i ponownie tworzysz synonimy i nie musisz dotykać kodu:

DROP SYNONYM dbo.mytablepointer;
CREATE SYNONYM dbo.mytablepointer FOR otherserver.somedb.dbo.mytable;
Aaron Bertrand
źródło
3

Uruchom to polecenie - będziesz mógł używać serwera lokalnego jako serwera połączonego bez potrzeby zmiany kodu

EXEC sp_addlinkedserver @server = 'LinkedServerName',
                        @provider ='SQLNCLI',
                        @datasrc ='LocalServerName',
                        @srvproduct = 'SQL'
Ashish Nigam
źródło