Creazione di un server collegato che punta a se stesso


14

Sto tentando di creare un server collegato sull'istanza di SQL Server 2014 servername\instancenameutilizzando la seguente chiamata:

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

Ricevo l'errore:

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

Funziona bene in SQL Server 2005 e, secondo MSDN ,

Il server collegato non deve essere un'altra istanza di SQL Server,

Quindi non sono sicuro di cosa sia cambiato nelle versioni recenti che non lo consentono. L'uso dell'interfaccia utente genera un messaggio simile:

Non è possibile creare un SQL Server locale come server collegato.

Capisco che è una cosa strana da richiedere, ma è supportare un codice legacy che ha funzionato nel 2005 (e che si trovava in istanze separate). La documentazione afferma che dovrebbe funzionare, ma non funziona. C'è un modo per farlo funzionare nel 2014 o dovrò modificare il codice sottostante?


1
In realtà non dovrebbe nemmeno fare la differenza. È possibile utilizzare un identificatore in 4 parti su un server locale bene.
Kris Gruttemeyer,

Perché stai cercando di creare un server collegato al server locale? Quale parte non funziona? Forse è quello che dovrebbe essere la tua domanda su ...
Aaron Bertrand

1
Il codice legacy è stato scritto per diverse istanze che si connettono tramite un server collegato. Ad un certo punto della storia, le due istanze sono state unite in un'unica istanza, ma il codice e il server collegato sono rimasti invariati. Il mio obiettivo è supportare il codice così com'è perché a) non so cosa sia necessario per cambiarlo eb) lo sviluppatore principale vuole essere in grado di supportare i database che verranno distribuiti in istanze separate in futuro.
Matteo

3
Potresti voler prendere in considerazione sinonimi. Quindi, se gli oggetti sono stati spostati su server diversi, è sufficiente rilasciare e ricreare i sinonimi e non è necessario toccare il codice.
Aaron Bertrand

Grazie Aaron. Penso che sia esattamente quello che stavo cercando. L'unico database usa sinonimi, quindi ho solo bisogno di rilasciarli / crearli rimuovendo il nome del server dal nome delle quattro parti. Quindi posso eliminare del tutto il server collegato. Se il database viene spostato in un secondo momento, posso aggiungere nuovamente il nome del server collegato nei sinonimi. Fatto.
Matteo

Risposte:


20

Risulta che sono stato in grado di farlo funzionare con parametri diversi.

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

Invece di occuparti dei riferimenti a server collegati all'interno del tuo codice, potresti prendere in considerazione un investimento di codice una tantum che prevede l'uso di un sinonimo in qualsiasi posizione in cui attualmente hai un server collegato.

Quindi invece di:

SELECT whatever FROM someserver.somedb.dbo.mytable;

Hai un sinonimo:

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

Quindi il tuo codice è semplicemente:

SELECT whatever FROM dbo.mytablepointer;

Quindi se hai oggetti spostati su server diversi, devi semplicemente rilasciare e ricreare i sinonimi e non devi toccare il codice:

DROP SYNONYM dbo.mytablepointer;
CREATE SYNONYM dbo.mytablepointer FOR otherserver.somedb.dbo.mytable;

3

Esegui questo comando: sarai in grado di utilizzare il server locale come server collegato senza che sia necessario modificare il codice

EXEC sp_addlinkedserver @server = 'LinkedServerName',
                        @provider ='SQLNCLI',
                        @datasrc ='LocalServerName',
                        @srvproduct = 'SQL'
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.