여러 서버(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 서버에서
B 서버에서
C 서버에서
여러 서버로 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'
@server='BServer',
@srvproduct='SQLServer',
@provider='SQLNCLI',
@datasrc='DB\BServer'
EXEC sp_addlinkedserver
@server='CServer',
@srvproduct='SQLServer',
@provider='SQLNCLI',
@datasrc='DB\CServer'
@server='CServer',
@srvproduct='SQLServer',
@provider='SQLNCLI',
@datasrc='DB\CServer'
B 서버에서
EXEC sp_addlinkedserver
@server='AServer',
@srvproduct='SQLServer',
@provider='SQLNCLI',
@datasrc='DB\AServer'
@server='AServer',
@srvproduct='SQLServer',
@provider='SQLNCLI',
@datasrc='DB\AServer'
EXEC sp_addlinkedserver
@server='CServer',
@srvproduct='SQLServer',
@provider='SQLNCLI',
@datasrc='DB\CServer'
@server='CServer',
@srvproduct='SQLServer',
@provider='SQLNCLI',
@datasrc='DB\CServer'
C 서버에서
EXEC sp_addlinkedserver
@server='AServer',
@srvproduct='SQLServer',
@provider='SQLNCLI',
@datasrc='DB\AServer'
@server='AServer',
@srvproduct='SQLServer',
@provider='SQLNCLI',
@datasrc='DB\AServer'
EXEC sp_addlinkedserver
@server='BServer',
@srvproduct='SQLServer',
@provider='SQLNCLI',
@datasrc='DB\BServer'
@server='BServer',
@srvproduct='SQLServer',
@provider='SQLNCLI',
@datasrc='DB\BServer'
이제 분할 뷰를 생성해보자 - 각각의 서버에서 조건에 맞게 동일하게 생성하는 것이 관건
A서버에서
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
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
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 시켜 줘야 한다
각각의 서버에서
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"
데이터 삽입은 어떤 서버에서 해도 각각의 서버로 분산되어 들어간다.
"SELECT * FROM dpv_userTbl"
[참조] 뇌를 자극하는 SQL Server 2005, P.415
'프로그래밍 > MSSQL' 카테고리의 다른 글
MSSQL 데이터베이스 복원 구문별 예제 (2) | 2011.02.08 |
---|---|
MSSQL 분할테이블 사용 (0) | 2011.02.08 |
MSSQL 외래키등 제약조건으로 인해 삽입이 안될때 잠시 제약을 꺼두자 (1) | 2011.02.07 |
MSSQL IDENTITY 컬럼 (2) | 2011.02.07 |
MSSQL DB파일의 변경 (4) | 2011.02.07 |