Criando um servidor vinculado que aponta para si mesmo

14

Estou tentando criar um servidor vinculado na instância do SQL Server 2014 servername\instancenameusando a seguinte chamada:

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

Estou recebendo o erro:

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

Isso funciona bem no SQL Server 2005 e, de acordo com o MSDN ,

O servidor vinculado não precisa ser outra instância do SQL Server,

Portanto, não tenho certeza do que mudou nas versões recentes que não permitem isso. O uso da interface do usuário gera uma mensagem semelhante:

Você não pode criar um SQL Server local como um servidor vinculado.

Entendo que é uma coisa estranha de se solicitar, mas é para dar suporte a algum código legado que funcionou em 2005 (e costumava estar em instâncias separadas). A documentação afirma que deve funcionar, mas não funciona. Existe uma maneira de fazer isso funcionar em 2014, ou precisarei modificar o código subjacente?

mathewb
fonte
1
Na verdade, nem deveria fazer diferença. Você pode usar um identificador de 4 partes em um servidor local.
Kris Gruttemeyer
Por que você está tentando criar um servidor vinculado ao servidor local? Que parte não funciona? Talvez seja sobre isso que sua pergunta deve ser ...
Aaron Bertrand
1
O código legado foi gravado para diferentes instâncias que se conectam através de um servidor vinculado. Em algum momento do histórico, as duas instâncias foram mescladas em uma única instância, mas o código e o servidor vinculado permaneceram inalterados. Meu objetivo é oferecer suporte ao código como está, pois: a) não sei o que está envolvido na alteração, eb) o desenvolvedor principal deseja suportar os bancos de dados que estão sendo distribuídos para instâncias separadas no futuro.
mathewb
3
Você pode querer considerar sinônimos. Então, se você tiver objetos movidos para servidores diferentes, basta soltar e recriar os sinônimos e não precisar tocar no código.
Aaron Bertrand
Obrigado Aaron. Eu acho que é exatamente isso que eu estava procurando. O banco de dados único usa sinônimos, então eu só preciso soltar / criá-los removendo o nome do servidor do nome de quatro partes. Então eu posso eliminar completamente o servidor vinculado. Se o banco de dados for movido posteriormente, posso adicionar o nome do servidor vinculado novamente aos sinônimos. Entendi.
mathewb

Respostas:

20

Acontece que eu consegui fazê-lo funcionar com parâmetros diferentes.

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

Em vez de lidar com referências de servidor vinculadas dentro do seu código, convém considerar um investimento de código único envolvendo o uso de um sinônimo em qualquer local em que atualmente você tenha um servidor vinculado.

Então, em vez de:

SELECT whatever FROM someserver.somedb.dbo.mytable;

Você tem um sinônimo:

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

Então seu código é simplesmente:

SELECT whatever FROM dbo.mytablepointer;

Então, se você tiver objetos movidos para servidores diferentes, basta soltar e recriar os sinônimos e não precisar tocar no código:

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

Executar este comando - você poderá usar o servidor local como servidor vinculado, sem necessidade de alteração de código

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