2011-09-07 4 views
1

SQL Server 2005를 사용하는 응용 프로그램에서 두 테이블을 사용하고 있습니다. 테이블 A와 테이블 B를 호출 해 봅니다. 자동 생성 된 정수 ID 인 표 A의 기본 키 열을 참조하는 외래 키 제약 조건이 표 B에 정의되어 있습니다. 내가하려고 할 때 지금이 트랜잭션을 실패 다른 SQL 서버 2005 게시자와 구독자 모두 병합 복제 (연속)을 만들려고 해요 때까지 모두가 잘 작동SQL Server 병합 복제로 인해 외부 키 오류가 발생합니다.

Start transaction 
Insert a row to table A 
Retrieve the last-generated ID ("SELECT @@IDENTITY ... ") 
Insert data to table B, using this ID 
Commit 

: 나는 다음과 같은 간단한 트랜잭션을 실행하는거야 때문에 외래 키 제약 조건의 실패, 테이블 B에 데이터를 삽입 :

The INSERT statement conflicted with the FOREIGN KEY constraint "FK_TableB_TableA". The conflict occurred in database "MyDB", table "TableA", column 'ID'. 

내가 그것을 병합 복제를 제거한 후, 그러나 테이블 A에 데이터를 삽입 한 후 투입에 의해 작동하게 할 수 없습니다, 모든했다. 데이터베이스 코드는 ADO를 사용하여 C++로 작성됩니다.

복제가 트랜잭션을 방해합니까? 가능한 다른 설명?

답변

0

@@ IDENTITY 기능의 범위와 관련된 것으로 보입니다. LAST_IDENT ('TableB') 대신에 일을 사용하는 것 같습니다. MSDN에 기재된 바와 같이

: 모든 세션 및 모든 범위 특정 테이블에 대해 생성 된 마지막 ID 값을 반환

  • IDENT_CURRENT.
  • @@ IDENTITY은 모든 범위에서 현재 세션의 모든 테이블에 대해 생성 된 마지막 ID 값을 반환합니다.
  • SCOPE_IDENTITY은 현재 세션의 테이블과 현재 범위에 대해 생성 된 마지막 ID 값을 반환합니다.
1

두 서버 노드의 표 A에 대한 기본 키 값이 서로 다릅니다 (즉, 각 노드에서 ID 범위 관리를 사용하고 있습니까?).

또한 외래 키 제약 조건이 Not For Replication property으로 구성 되었습니까?

외부 키 제약 조건이 이미 게시자에서 로컬로 적용 되었기 때문에 구독자와 병합 할 때 다시 확인하지 않아도됩니다.

+0

고마워요! 당신의 포인트에 대해서 - 1. 자동 ID 관리를 사용하고 있습니다. 어쨌든, 활동은 매우 희박합니다. PK 충돌이 근본 원인이라고 생각하지 않습니다. 2. (두 서버 모두에서) 외래 키에 "NOT FOR REPLICATION"속성을 적용했지만 상황을 변경하지는 않았습니다. – Itaypk

관련 문제