SQL서버에서 링크드 서버와의 분산 트랜잭션을 처리하기 위한 과정을 정리 합니다.
양쪽 서버에서 제대로 설정이 되어 있지 않은 경우 아래와 같은 오류가 발생 한다.
연결된 서버 "XXXX"의 OLE DB 공급자 "SQLNCLI10"이(가) 분산 트랜잭션을 시작할 수 없으므로 요청한 작업을 수행할 수 없습니다.
1. 만약 Windows서버가 2003이면 프로그램추가삭제 > Windows구성요소 추가/제거 에서 응용프로그램서버(Application Server)를 선택하고 '자세히' 버튼을 누른 후, 네트워크 DTC 액세스 사용(Enable network DTC access)을 설치한다.
시작메뉴 > 실행에서 regedit 를 입력하여 레지스트리 편집기에서
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSTDC 에서 TurnOffRpcSecurity 키의 값을 1로 해 준다.
서비스 에서 'Distributed Transaction Coordinator'를 다시 시작 한다.
2. 만약 Windows서버가 2008 이상 이면 다음과 같이 한다.
① 시작메뉴 > 실행에서 dcomcnfg를 입력한 다음 확인
② 구성 요소 서비스 > 컴퓨터 > 내 컴퓨터 > Distributed Transaction Coordinator > 로컬 DTC 선택
③ 로컬 DTC를 마우스 오른쪽 단추로 클릭하고 속성 선택
④ 로컬 DTC 속성 창이 나타나면 보안 탭을 클릭 후 다음과 같이 설정
3. 만약 Windows 방화벽을 사용하고 있다면 Distributed Transaction Coordinator 를 예외로 두어야 한다.
4. SQL 상에서는 반드시 SET XACT_ABORT ON 으로 세팅을 하고 begin tran 대신 begin DISTRIBUTED tran 을 사용 해야 한다.
5. 만약 상대 DB가 Oracle 인 경우는 위과 같이 해도 안 될 수 있는데 , 이때는 레지스트리에서 다음과 같이 수정 해 준다.
레지스트리 경로는 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSDTC\MTxOCI 이다.
기본적으로 OracleSqlLib와 OracleXaLib가 각각 SQLLib80.dll, xa80.dll로 되어 있는데 이를 설치된 Oracle의 버전에 따라
변경 해 준다.
(변경 전)
(예: Oracle 10인 경우)
이 글이 도움이 되셨으면 댓글을 남겨 주세요!
'데이터베이스' 카테고리의 다른 글
[SQL서버] 트리거에서 RAISERROR 발생 시키면? (0) | 2015.01.13 |
---|---|
[SQL서버] 제약조건 걸린 다른 테이블 확인 (0) | 2014.10.28 |
[SQL서버] 동적쿼리에서 파라미터 사용 (0) | 2014.07.22 |
[SQL서버] RANK() 함수 (0) | 2014.06.26 |
[MySQL] Windows 7 64bit에서 MySQL 32bit ODBC 드라이버가 안 보일 때 (2) | 2014.05.21 |