트랜잭션 복제 환경에서 게시자에서 변경된 데이터는 SP 또는 ad-hoc 쿼리의 형태로 구독자에 반영하게 된다. 예를들어 2개의 row를 한번에 업데이트 하는 구문이 게시자에서 수행되면 구독자에서는 각각의 row 를 업데이트하는 SP가 2번 수행되어 변경된 값을 반영하게 된다.

이때 게시자에서 변경된 데이터가 유니크 인덱스의 컬럼중 하나라면 유니크 제약조건을 보장해 주는데 문제가 발생할 수 있다. 예를 들어 게시자에서 다음과 같은 스크립트를 수행하여 데이터를 업데이트 한다고 가정해 보자.

-- 테이블 생성. 이 테이블이 복제에 사용된다고 가정
create table t1 (
 col1 int not null constraint PK_t1 primary key
, col2 int
)

-- 테스트 데이터 입력.
insert into t1 select 1, 1
insert into t1 select 2, -1

-- 유니크 인덱스 생성
create unique index uni_t1_col2 on t1 (col2)

-- 데이터 업데이트.
update t1 set col2 = col2*(-1)

마지막 라인에서 데이터 업데이트시 "한번에 2개 row를 업데이트 했다"는 내용을 2개의 SP에 나눠서 구독에 적용할 경우 유니크 조건을 만족시키기 위하여 구독에서는 update 대신 delete 후 insert 의 동작으로 변경하여 반영한다. 따라서 구독에서는 다음과 같은 동작으로 변경된다.

delete t1 where col1 = 1
delete t1 where col1 = 2
insert into t1 (col1, col2) values (1, -1)
insert into t1 (col1, col2) values (1, 1)

따라서 트랜잭션 복제 환경에서 아티클에 유니크 제약조건이 걸려있는 컬럼을 업데이트 하는 경우 동기화에 좀 더 많은 비용이 든다는것을 고려해야 한다.

select @@version
Microsoft SQL Server  2000 - 8.00.2282 (Intel X86)
        Dec 30 2008 02:22:41 
        Copyright (c) 1988-2003 Microsoft Corporation
        Developer Edition on Windows NT 5.1 (Build 2600: Service Pack 3)


하만철 / Ha Man cheol
EMail : feisia@hanmail.net

AND