Erstellen eines Verbindungsservers, der auf sich selbst verweist

14

Ich versuche, einen Verbindungsserver auf der SQL Server 2014-Instanz zu erstellen servername\instancename mit dem folgenden Aufruf :

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

Ich erhalte den Fehler:

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

Dies funktioniert gut in SQL Server 2005 und nach MSDN ,

Der Verbindungsserver muss keine andere Instanz von SQL Server sein.

Ich bin mir also nicht sicher, was sich in den letzten Versionen geändert hat, die dies nicht zulassen. Die Verwendung der Benutzeroberfläche generiert eine ähnliche Meldung:

Sie können keinen lokalen SQL Server als Verbindungsserver erstellen.

Ich verstehe, dass es eine seltsame Sache ist, etwas anzufordern, aber es ist, einen älteren Code zu unterstützen, der 2005 funktionierte (und sich früher auf separaten Instanzen befand). Die Dokumentation besagt, dass es funktionieren sollte, aber es funktioniert nicht. Gibt es eine Möglichkeit, dies 2014 zum Laufen zu bringen, oder muss ich den zugrunde liegenden Code ändern?

mathewb
quelle
1
Eigentlich sollte es keinen Unterschied machen. Sie können einen 4-teiligen Bezeichner problemlos auf einem lokalen Server verwenden.
Kris Gruttemeyer
Warum versuchen Sie, einen Verbindungsserver mit dem lokalen Server zu erstellen? Welcher Teil funktioniert nicht? Vielleicht ist es das, worum es in Ihrer Frage gehen sollte ...
Aaron Bertrand
1
Der Legacy-Code wurde für verschiedene Instanzen geschrieben, die über einen Verbindungsserver verbunden sind. Zu einem bestimmten Zeitpunkt im Verlauf wurden die beiden Instanzen zu einer einzigen Instanz zusammengeführt, der Code und der Verbindungsserver blieben jedoch unverändert. Mein Ziel ist es, den Code so zu unterstützen, wie er ist, weil a) ich nicht weiß, wie er geändert werden soll, und b) der Hauptentwickler in der Lage sein möchte, die Verteilung der Datenbanken auf separate Instanzen in der Zukunft zu unterstützen.
Mathewb
3
Möglicherweise möchten Sie Synonyme berücksichtigen. Wenn Sie Objekte auf andere Server verschoben haben, müssen Sie nur die Synonyme löschen und neu erstellen, ohne den Code berühren zu müssen.
Aaron Bertrand
Vielen Dank, Aaron. Ich denke, das ist genau das, wonach ich gesucht habe. Die eine Datenbank verwendet Synonyme, also muss ich sie nur löschen / erstellen, indem ich den Servernamen aus dem vierteiligen Namen entferne. Dann kann ich den Verbindungsserver ganz beseitigen. Wenn die Datenbank später verschoben wird, kann ich den Namen des Verbindungsservers wieder in die Synonyme einfügen. Ich habs.
Matthewb

Antworten:

20

Es stellte sich heraus, dass ich es mit verschiedenen Parametern zum Laufen bringen konnte.

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
quelle
11

Anstatt sich mit Verweisen auf Verbindungsserver in Ihrem Code zu befassen, sollten Sie eine einmalige Codeinvestition in Betracht ziehen, bei der an jedem Ort, an dem Sie derzeit einen Verbindungsserver haben, ein Synonym verwendet wird.

Also statt:

SELECT whatever FROM someserver.somedb.dbo.mytable;

Sie haben ein Synonym:

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

Dann lautet Ihr Code einfach:

SELECT whatever FROM dbo.mytablepointer;

Wenn Sie Objekte auf andere Server verschoben haben, müssen Sie nur die Synonyme löschen und neu erstellen, ohne den Code berühren zu müssen:

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

Führen Sie diesen Befehl aus - Sie können den lokalen Server als Verbindungsserver verwenden, ohne dass eine Codeänderung erforderlich ist

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