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?


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;'

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;

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'
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.