Création d'un serveur lié qui pointe vers lui-même

14

J'essaie de créer un serveur lié sur une instance SQL Server 2014 servername\instancenameà l'aide de l'appel suivant:

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

Je reçois l'erreur:

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

Cela fonctionne bien dans SQL Server 2005, et selon MSDN ,

Le serveur lié ne doit pas être une autre instance de SQL Server,

Je ne suis donc pas sûr de ce qui a changé dans les versions récentes qui interdisent cela. L'utilisation de l'interface utilisateur génère un message similaire:

Vous ne pouvez pas créer un serveur SQL local en tant que serveur lié.

Je comprends que c'est une chose étrange à demander, mais c'est pour prendre en charge un code hérité qui a fonctionné en 2005 (et était sur des instances distinctes). La documentation indique que cela devrait fonctionner, mais ce n'est pas le cas. Existe-t-il un moyen de faire fonctionner cela en 2014, ou vais-je devoir modifier le code sous-jacent?

mathewb
la source
1
Cela ne devrait même pas faire de différence. Vous pouvez très bien utiliser un identifiant en 4 parties sur un serveur local.
Kris Gruttemeyer du
Pourquoi essayez-vous de créer un serveur lié au serveur local? Quelle partie ne fonctionne pas? Peut-être que c'est ce que devrait être votre question ...
Aaron Bertrand
1
Le code hérité a été écrit pour différentes instances se connectant via un serveur lié. À un moment donné de l'histoire, les deux instances ont été fusionnées en une seule instance, mais le code et le serveur lié sont restés inchangés. Mon objectif est de prendre en charge le code tel quel car a) je ne sais pas ce qu'il faut pour le changer, et b) le développeur principal souhaite pouvoir prendre en charge les bases de données distribuées dans des instances distinctes à l'avenir.
mathewb
3
Vous voudrez peut-être envisager des synonymes. Ensuite, si vous avez des objets déplacés vers différents serveurs, il vous suffit de supprimer et de recréer les synonymes et de ne pas avoir à toucher le code.
Aaron Bertrand
Merci Aaron. Je pense que c'est exactement ce que je cherchais. La base de données utilise des synonymes, j'ai donc juste besoin de les déposer / créer en supprimant le nom du serveur du nom en quatre parties. Ensuite, je peux éliminer complètement le serveur lié. Si la base de données est déplacée plus tard, je peux rajouter le nom du serveur lié dans les synonymes. Je l'ai.
mathewb

Réponses:

20

Il s'avère que j'ai pu le faire fonctionner avec différents paramètres.

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
la source
11

Au lieu de traiter des références de serveur lié à l'intérieur de votre code, vous voudrez peut-être envisager un investissement de code unique impliquant l'utilisation d'un synonyme dans n'importe quel emplacement où vous disposez actuellement d'un serveur lié.

Donc au lieu de:

SELECT whatever FROM someserver.somedb.dbo.mytable;

Vous avez un synonyme:

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

Ensuite, votre code est simplement:

SELECT whatever FROM dbo.mytablepointer;

Ensuite, si vous avez des objets déplacés vers différents serveurs, il vous suffit de supprimer et de recréer les synonymes et de ne pas avoir à toucher le code:

DROP SYNONYM dbo.mytablepointer;
CREATE SYNONYM dbo.mytablepointer FOR otherserver.somedb.dbo.mytable;
Aaron Bertrand
la source
3

Exécutez cette commande - vous pourrez utiliser le serveur local comme serveur lié sans changement de code nécessaire

EXEC sp_addlinkedserver @server = 'LinkedServerName',
                        @provider ='SQLNCLI',
                        @datasrc ='LocalServerName',
                        @srvproduct = 'SQL'
Ashish Nigam
la source