Crear un servidor vinculado que se señale a sí mismo

14

Estoy intentando crear un servidor vinculado en la instancia de SQL Server 2014 servername\instancenameusando la siguiente llamada:

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

Recibo el error:

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

Esto funciona bien en SQL Server 2005 y, según MSDN ,

El servidor vinculado no tiene que ser otra instancia de SQL Server,

Por lo tanto, no estoy seguro de qué ha cambiado en las versiones recientes que no permiten esto. Usar la interfaz de usuario genera un mensaje similar:

No puede crear un servidor SQL local como un servidor vinculado.

Entiendo que es algo extraño solicitar, pero es para admitir algún código heredado que funcionó en 2005 (y solía estar en instancias separadas). La documentación indica que debería funcionar, pero no es así. ¿Hay alguna manera de hacer que esto funcione en 2014, o tendré que modificar el código subyacente?

mathewb
fuente
1
En realidad, ni siquiera debería hacer la diferencia. Puede usar un identificador de 4 partes en un servidor local bien.
Kris Gruttemeyer
¿Por qué está intentando crear un servidor vinculado al servidor local? ¿Qué parte no funciona? Tal vez de eso deba tratarse su pregunta ...
Aaron Bertrand
1
El código heredado se escribió para diferentes instancias que se conectan a través de un servidor vinculado. En algún momento de la historia, las dos instancias se fusionaron en una sola instancia, pero el código y el servidor vinculado no se modificaron. Mi objetivo es admitir el código tal como está porque a) No sé qué implica cambiarlo, yb) el desarrollador principal quiere poder admitir las bases de datos que se distribuyen a instancias separadas en el futuro.
mathewb
3
Es posible que desee considerar sinónimos. Luego, si tiene objetos movidos a diferentes servidores, simplemente suelte y vuelva a crear los sinónimos y no tenga que tocar el código.
Aaron Bertrand
Gracias Aaron Creo que eso es exactamente lo que estaba buscando. La única base de datos usa sinónimos, por lo que solo necesito colocarlos / crearlos eliminando el nombre del servidor del nombre de cuatro partes. Entonces puedo eliminar el servidor vinculado por completo. Si la base de datos se mueve más adelante, puedo agregar el nombre del servidor vinculado nuevamente a los sinónimos. Entendido.
mathewb

Respuestas:

20

Resulta que pude hacerlo funcionar con diferentes parámetros.

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

En lugar de tratar con referencias de servidores vinculados dentro de su código, es posible que desee considerar una inversión de código de una sola vez que implique el uso de un sinónimo en cualquier ubicación donde actualmente tenga un servidor vinculado.

Entonces en lugar de:

SELECT whatever FROM someserver.somedb.dbo.mytable;

Tienes un sinónimo:

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

Entonces su código es simplemente:

SELECT whatever FROM dbo.mytablepointer;

Luego, si tiene objetos movidos a diferentes servidores, simplemente suelte y vuelva a crear los sinónimos y no tenga que tocar el código:

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

Ejecute este comando: podrá utilizar el servidor local como servidor vinculado sin necesidad de cambiar el código

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