자신을 가리키는 연결된 서버 만들기


14

servername\instancename다음 호출을 사용하여 SQL Server 2014 인스턴스에서 연결된 서버를 만들려고합니다 .

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

오류가 발생합니다.

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

이에 따라 SQL Server 2005의 벌금을 작동하고, MSDN ,

연결된 서버가 다른 SQL Server 인스턴스 일 필요는 없습니다.

그래서 이것을 허용하지 않는 최신 버전에서 무엇이 바뀌 었는지 잘 모르겠습니다. UI를 사용하면 비슷한 메시지가 생성됩니다.

로컬 SQL Server를 연결된 서버로 만들 수 없습니다.

요청하는 것이 이상하다는 것을 이해하지만 2005 년에 작동하고 별도의 인스턴스에 있던 일부 레거시 코드를 지원해야합니다. 설명서에는 작동하지만 작동하지 않아야한다고 나와 있습니다. 2014 년에 이것을 작동시키는 방법이 있습니까, 아니면 기본 코드를 수정해야합니까?


1
실제로 차이를 만들어서는 안됩니다. 로컬 서버에서 4 부분 식별자를 사용할 수 있습니다.
Kris Gruttemeyer

로컬 서버에 연결된 서버를 만들려고하는 이유는 무엇입니까? 어떤 부분이 작동하지 않습니까? 아마 그게 당신의 질문에 대한 것입니다 ...
Aaron Bertrand

1
레거시 코드는 연결된 서버를 통해 서로 다른 인스턴스에 연결되도록 작성되었습니다. 어느 시점에서 두 인스턴스는 단일 인스턴스로 병합되었지만 코드와 연결된 서버는 변경되지 않았습니다. 내 목표는 코드를 그대로 지원하는 것입니다 .a) 코드 변경에 관련된 내용을 알지 못하고 b) 주요 개발자는 향후 별도의 인스턴스에 배포되는 데이터베이스를 지원할 수 있기를 원하기 때문입니다.
mathewb

3
동의어를 고려할 수 있습니다. 그런 다음 객체를 다른 서버로 옮긴 경우 동의어를 삭제하고 다시 작성하기 만하면 코드를 건드릴 필요가 없습니다.
Aaron Bertrand

고마워 애런 그것이 바로 내가 찾던 것이라고 생각합니다. 하나의 데이터베이스는 동의어를 사용하므로 네 부분으로 된 서버 이름에서 서버 이름을 제거하고 삭제해야합니다. 그런 다음 연결된 서버를 모두 제거 할 수 있습니다. 데이터베이스가 나중에 이동하면 연결된 서버 이름을 동의어에 다시 추가 할 수 있습니다. 알았다.
mathewb

답변:


20

다른 매개 변수로 작업 할 수있었습니다.

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

코드 내에서 연결된 서버 참조를 처리하는 대신 현재 연결된 서버가있는 모든 위치에서 동의어 를 사용하는 일회성 코드 투자를 고려할 수 있습니다.

따라서 대신 :

SELECT whatever FROM someserver.somedb.dbo.mytable;

동의어가 있습니다 :

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

그런 다음 코드는 간단합니다.

SELECT whatever FROM dbo.mytablepointer;

그런 다음 객체를 다른 서버로 옮겼다면 동의어를 삭제하고 다시 만들고 코드를 만질 필요가 없습니다.

DROP SYNONYM dbo.mytablepointer;
CREATE SYNONYM dbo.mytablepointer FOR otherserver.somedb.dbo.mytable;

3

이 명령을 실행하면 코드 변경없이 로컬 서버를 연결된 서버로 사용할 수 있습니다.

EXEC sp_addlinkedserver @server = 'LinkedServerName',
                        @provider ='SQLNCLI',
                        @datasrc ='LocalServerName',
                        @srvproduct = 'SQL'
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.