본문 바로가기

프로그래밍/MSSQL

MSSQL 분할뷰 사용

여러 서버(host)에 분산된 DB를 연결하여 하나의 테이블 및 뷰에서 쿼리를 날리듯이 분할 뷰를 사용해 보자
여러 서버로 DB가 분산되어 있을때 유용하다

서버가 A, B, C로 나뉘어 있을 경우에
서버 A에서 B와 C를 연결서버로 설정하고
서버 B에서 A와 C를 연결서버로 설정하고
서버 C에서 A와 B를 연결설정한다.

각각의 서버에 해당 서버에만 DB가 저장될 수 있도록 특정 필드에 제약 조건을 둔다
예)
   --A 서버
   Create Table ...
   (
      ...
      addr nchar(4) not null  CHECK(addr = '서울')
      ...
   )

   --B 서버
   Create Table ...
   (
      ...
      addr nchar(4) not null  CHECK(addr = '경기')
      ...
   )

   --C 서버
   Create Table ...
   (
      ...
      addr nchar(4) not null  CHECK(addr <> '서울' AND addr <> '경기')
      ...
   )


링크서버 만드는 스크립트
링크서버를 만들기 전에 별칭(ALIAS 를 지정한다, Host/Port등 지정)
예)
A 서버에서
EXEC sp_addlinkedserver
    @server='BServer',
    @srvproduct='SQLServer',
    @provider='SQLNCLI',
    @datasrc='DB\BServer'
EXEC sp_addlinkedserver
    @server='CServer',
    @srvproduct='SQLServer',
    @provider='SQLNCLI',
    @datasrc='DB\CServer'

B 서버에서
EXEC sp_addlinkedserver
    @server='AServer',
    @srvproduct='SQLServer',
    @provider='SQLNCLI',
    @datasrc='DB\AServer'
EXEC sp_addlinkedserver
    @server='CServer',
    @srvproduct='SQLServer',
    @provider='SQLNCLI',
    @datasrc='DB\CServer'

C 서버에서
EXEC sp_addlinkedserver
    @server='AServer',
    @srvproduct='SQLServer',
    @provider='SQLNCLI',
    @datasrc='DB\AServer'
EXEC sp_addlinkedserver
    @server='BServer',
    @srvproduct='SQLServer',
    @provider='SQLNCLI',
    @datasrc='DB\BServer'

이제 분할 뷰를 생성해보자 - 각각의 서버에서 조건에 맞게 동일하게 생성하는 것이 관건
A서버에서

CREATE VIEW dpv_userTbl AS
    SELECT * FROM partViewDB.dbo.userTbl
    UNION ALL
    SELECT * FROM BServer.partViewDB.dbo.userTbl
    UNION ALL
    SELECT * FROM CServer.partViewDB.dbo.userTbl

B서버에서

CREATE VIEW dpv_userTbl AS
    SELECT * FROM AServer.partViewDB.dbo.userTbl
    UNION ALL
    SELECT * FROM partViewDB.dbo.userTbl
    UNION ALL
    SELECT * FROM CServer.partViewDB.dbo.userTbl

C서버에서

CREATE VIEW dpv_userTbl AS
    SELECT * FROM AServer.partViewDB.dbo.userTbl
    UNION ALL
    SELECT * FROM BServer.partViewDB.dbo.userTbl
    UNION ALL
    SELECT * FROM partViewDB.dbo.userTbl

중첩 트랜잭션을 위해서는 반드시 "XACT_ABORT"  를 ON 시켜 줘야 한다
각각의 서버에서
"SET XACT_ABOART ON" 을 실행한다

이제 데이터를 삽입한 후에 해당 뷰에 SELECT문을 날려보자 (어느 서버에서 실행해도 동일한 결과를 얻을 수 있다.
데이터 삽입은 어떤 서버에서 해도 각각의 서버로 분산되어 들어간다.

"SELECT * FROM dpv_userTbl"
[참조] 뇌를 자극하는 SQL Server 2005, P.415