연결된 서버를 참조하는 이식 가능한 SQL을 작성하는 방법


9

연결된 서버를 나타내는 저장 프로 시저가 있습니다. 절차 전반에 걸쳐 여러 곳에서 다음과 같은 것을 얻었습니다.

INSERT INTO [TableName]
(...Columns...)
SELECT ...Columns...
FROM [ServerName\InstanceName].[Catalogue].[dbo].[TableName]
WHERE TableNameID = @TableNameID

이 절차는 내 개발 환경, 테스트 환경 및 라이브 환경에 있습니다.

문제는 서버 이름이 각 환경마다 다르기 때문에 각 프로 시저 사본이 미묘하게 다르다는 것입니다. 이로 인해 스크립트 업데이트 배포 관리가 번거로워집니다.

각 환경에서 동일한 버전을 실행할 수 있도록 프로 시저를 이식 가능하게 만드는 방법이 있습니까?

그렇지 않은 경우 스크립트 배포가 실수 / 오류에 덜 취약 해 지도록 할 수있는 방법이 있습니까?


3
각 서버마다 다른보기를 작성하는 것이 옵션입니까? 뷰를 정의 할 수 SELECT <fields> FROM <linked server>있지만 모든 서버에서 동일한 뷰 이름을 사용하여 코드 유지
JNK

@JNK는 나쁜 생각은 아니지만, 몇 가지 테이블이 있지만 링크 된 서버 참조가 반영 된 저장 프로 시저보다 뷰를 유지 관리하는 것이 더 간단합니다.
닥터 존스

@ jnk, 그 대답을해야합니다.
HLGEM

답변:


14

연결된 서버 이름이 서버 이름 일 필요는 없습니다. 일반 이름을 사용할 수 있습니다.

EXEC master.dbo.sp_addlinkedserver
    @server = N'COMMONNAME',
    @srvproduct=N'MSDASQL',
    @provider=N'SQLNCLI',
    @provstr=N'DRIVER={SQL Server};SERVER=ACTUALSERVERNAME;UID=user1;PWD=rosebud567;', 
    @catalog=N'database1'

각 환경에서 동일한 이름으로 연결된 서버를 설정하지만 실제로 다른 서버를 가리 킵니다.


0

나는 일반 연결된 서버 이름을 사용하는 아이디어를 좋아합니다. 그러나 많은 환경에서 이것이 가능하지 않을 수 있습니다.이 경우 sp에서 동적 SQl을 사용할 수 있습니다.

declare @linkedservername nvarchar(200)
declare @sql nvarchar(4000)
SET @linkedservername =  CASE @@ServerName  
                            WHEN 'DevServer' THEN 'LinkedServerForDevEnvironment'
                            WHEN 'TestServer' THEN 'LinkedServerForTestEnvironment'
                            WHEN 'ProdServer' THEN 'LinkedServerForProdEnvironment'
                            ELSE Null
                        END   

set @sql = 'INSERT INTO [TableName] 
(...Columns...) 
SELECT ...Columns... 
FROM ' + @linkedservername + '.[Catalogue].[dbo].[TableName] 
WHERE TableNameID = @TableNameID'

Exec  @sql

1
실생활 에서이 작업을 수행하는 경우 try 문 블록을 사용하고 set 문 다음에 @linkedservername이 null 인 경우 이것이 잘못된 서버에서 실행되었음을 경고하기 위해 오류를 발생시킵니다.
HLGEM

1
이 접근 방식을 취했다면 CASE 문을 함수로 감싸서 서버가 변경되면 함수를 업데이트해야한다고 생각합니다.
Eli

좋은 점 @ 엘리
HLGEM
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.