트리거에서 서로다른 서버에 linkedserver로 insert 하기

2008. 3. 6. 20:46 개발언어/SQL
2008/03/06 - [개발언어] - Distributed Transaction Coordinator(MSDTC)의 분산 트랜잭션 설정하기

SET XACT_ABORT ON 은 뭐란 말인가?


테스트한 서버환경은
windows xp sp2에 sql 2000 server이였다.

시작 -> dcomcnfg.exe를 하여 MSDTC를 설정했다. 보안등급을 설정하면 된다 (두서버다 설정했다)
( 관련 자료를 참고하면된다)

시작 -> Firewall.cpl 하여 방화벽에서 예외처리에서 windows\system32\Msdtc.exe파일을 추가해준다.
그리고 포트를 TCP 135를 열어준면된다


하지만 하다 보니깐 에러가 난다.
처음에는 이렇게 나왔다.

서버: 메시지 7391, 수준 16, 상태 1, 줄 1
OLE/DB 공급자 'SQLOLEDB'이(가) 분산 트랜잭션을 시작할 수 없으므로 작업을 수행할 수 없습니다.
[OLE/DB provider returned message: New transaction cannot enlist in specified transaction coordinator ]
OLE DB 오류 추적 [OLE/DB Provider 'SQLOLEDB' ITransactionJoin::JoinTransaction returned 0x8004d00a].

MSDTC설정때문에 에러가 난거였다. 다시 설정했다.
You may receive a 7391 error message in SQL Server 2000 when you run a distributed transaction against a
linked server after you install Windows Server 2003 or Windows XP Service Pack 2
http://support.microsoft.com/kb/839279/en-us (English)
http://support.microsoft.com/kb/873160/ko (korean)


하지만 또 에러가 나왔다.

서버: 메시지 7395, 수준 16, 상태 2, 프로시저 TRI_AUTO_INSERT, 줄 6
OLE DB 공급자 'SQLOLEDB'에 대해 중첩된 트랜잭션을 시작할 수 없습니다. XACT_ABORT 옵션이 OFF로 설정되어 있으므로 중첩 트랜잭션이 필요합니다.
[OLE/DB provider returned message: 이 세션에서는 트랜잭션을 더 이상 시작할 수 없습니다.]
OLE DB 오류 추적 [OLE/DB Provider 'SQLOLEDB' ITransactionLocal::StartTransaction returned 0x8004d013:  ISOLEVEL=4096].

이건뭐지?
XACT_ABORT  ON 후에
inset 구문을 넣으니깐 잘된다!!! 음..

http://sqler.pe.kr/sql2k/1102.asp 참고해서 좀 읽어보았다.