Linked Server를 사용하여 SQLServer에서 Postgres에 연결

개요



Postgres를 기본 DB로 사용하는 환경에서,
사정에 의해 SQLServer 경유로 Postgres에 접속하고 싶어졌다.

다음과 같은 연결
Client -> SQL Server -> Postgres

이것을 SQLServer Linked Server
직접 관련이 없는 것도 있지만, 구축한 환경의 그 외 정보
  • Postgres는 RDS Aurora를 사용합니다
  • 외부에서 Postgres에 연결하려면 발판 (Linux) 서버로의 SSH 터널이 필요합니다
  • SQLServer는 express edition
  • SQLServer는 임의의 위치에 있으며 클라이언트에서 연결할 수 있습니다.

    설정 절차



    사전 준비



    사전에 SQLServer를 배치하는 인스턴스에 SQLServerSSMS 를 인스톨 해 사용할 수 있도록 해 둔다.

    Postgres ODBC 드라이버 설치



    posrgres12라면 여기에서 다운로드

    흐름에 따라 SQLServer를 배포하는 인스턴스에 설치합니다.

    SQLServer에 연결된 서버 설정


    SSMS 에서 쿼리 편집기를 열고 아래 예제와 같이 작성한 다음 실행
    ※중에서 postgres에의 접속 설정이 있으므로 재작성해 주세요
    ※이번은 ssh 터널 경유의 예이므로, postgres server가 localhost라든지 port12345야가 되고 있습니다
    DECLARE @name NVARCHAR(4000);
    DECLARE @provider NVARCHAR(4000);
    DECLARE @provstr NVARCHAR(4000);
    DECLARE @db_name NVARCHAR(4000);
    
    -- destination postgres database
    SET @name = N'test'; -- リンクServerの名前。任意につける。後にselectとかする時に必要
    SET @provider = N'MSDASQL';
    SET @provstr = 'Driver={PostgreSQL UNICODE};Server=localhost;Port=12345;Database=test_db;UID=test_user;Password=test_user_password;Network=dbmssocn;'
    SET @db_name = N'test_db';  -- postgres db name
    
    -- create linked server
    EXEC MASTER.dbo.sp_addlinkedserver @server = @name
    ,@srvproduct = N'PostgreSQL'
    ,@provider = @provider
    ,@provstr = @provstr
    ,@catalog = @db_name
    
    -- set up Extended properties of the Linked Server
    EXEC MASTER.dbo.sp_serveroption @server = @name
    ,@optname = 'data access'
    ,@optvalue = 'true'
    EXEC MASTER.dbo.sp_serveroption @server = @name
    ,@optname = 'use remote collation'
    ,@optvalue = 'true'
    EXEC MASTER.dbo.sp_serveroption @server = @name
    ,@optname = 'rpc'
    ,@optvalue = 'true'
    EXEC MASTER.dbo.sp_serveroption @server = @name
    ,@optname = 'rpc out'
    ,@optvalue = 'true'
    GO
    

    잘 설정할 수 있으면 아래와 같이 SSMS 로부터 테이블 정보등을 볼 수 있다



    SQLServer에서 Postgres 테이블로 쿼리 게시



    SQLServer에서 보통 select를 발행하면 SQLServer에만 참조 잠금이 걸린다.
    이것은 싫어.T-SQLOPENQUERY 를 사용해 SQL을 발행하면 참조 락이 걸리지 않는 것 같다.
    select * from OPENQUERY(
      hoge, -- link server name
      'select * from xxxxxxxxx'
    )
    
  • 좋은 웹페이지 즐겨찾기