KB4135113 - 수정: SQL Server 클러스터형 또는 고유 인덱스가 있는 테이블에서 업데이트하는 동안 변경 내용 추적 레코드가 일치하지 않습니다.

적용 대상
SQL Server 2016 Developer - duplicate (do not use) SQL Server 2016 Enterprise - duplicate (do not use) SQL Server 2016 Enterprise Core - duplicate (do not use) SQL Server 2016 Standard - duplicate (do not use) SQL Server 2014 Service Pack 2 - duplicate (do not use) SQL Server 2014 Developer - duplicate (do not use) SQL Server 2014 Enterprise - duplicate (do not use) SQL Server 2014 Enterprise Core - duplicate (do not use) SQL Server 2014 Standard - duplicate (do not use) SQL Server 2017 Developer on Windows SQL Server 2017 Enterprise on Windows SQL Server 2017 Enterprise Core on Windows SQL Server 2017 Standard on Windows

증상

클러스터형 또는 고유 인덱스가 있는 테이블에서 업데이트를 실행하고 기본이 아닌 고유 열에서 업데이트가 발생하는 경우 변경 내용 추적 레코드가 update 문과 일치하지 않습니다.

예를 들어 "column1"이라는 열이 클러스터형 또는 고유 인덱스 에 포함되어 있다고 가정합니다. 열 값이 더 큰 값에서 더 작은 값(예: 값을 20에서 16으로 변경)으로 변경되면 변경 내용 추적 쪽 테이블은 삭제 작업 전에 삽입 작업을 받습니다. 예를 들어 행 삭제 작업 전에 트랜잭션 로그 삽입 행 레코드 작업이 수신되거나 "D" 앞에 "I"가 삽입됩니다.

Sys_change_version sys_change_create_version sys_change_operation sys_change_column sys_change_context PK_column
1116 19 I NULL NULL 5639485628
1116 20 D NULL NULL 5639485628

열 값이 더 작은 값에서 더 큰 값(예: 값을 16에서 20으로 변경)으로 변경되면 "D"가 "I" 앞에 삽입됩니다.

Sys_change_version sys_change_create_version sys_change_operation sys_change_column sys_change_context PK_column
1126 32 D NULL NULL 5639485628
1126 33 I NULL NULL 5639485628

원인

이 문제는 변경 내용 추적 쪽 테이블에서 삭제/삽입 쌍 간의 잘못된 순서로 인해 발생합니다.

해결 방법

이 문제에 대한 수정 사항은 SQL Server 대한 다음 업데이트에 포함되어 있습니다.

2017년 SQL Server 대한 누적 업데이트 8

SQL Server 2016 서비스 팩 1의 누적 업데이트 9

SQL Server 2014 SP2에 대한 누적 업데이트 12

SQL Server 빌드 정보

SQL Server 대한 각 새 빌드에는 이전 빌드에 있던 모든 핫픽스 및 보안 수정 사항이 포함되어 있습니다. SQL Server 최신 빌드를 설치하는 것이 좋습니다.

SQL Server 2017의 최신 누적 업데이트

SQL Server 2016의 최신 빌드

SQL Server 2014의 최신 누적 업데이트

상태

Microsoft에서 이는 "적용 대상" 섹션에 나열된 Microsoft 제품에서의 문제임을 확인했습니다.

추가 정보

변경 내용 추적 사용 테이블의 경우 고유한 것으로 정의된 기본이 아닌 열에서 업데이트가 발생하면 변경 내용 추적 쪽 테이블에 두 개의 항목이 삽입됩니다. 각 분할 작업에 대해 하나의 항목인 삽입 및 삭제입니다.

변경 내용을 열거하기 위해 CHANGETABLE 함수가 호출되면 이러한 항목은 기본 키 값별로 정렬된 다음 작업이 집계됩니다. 업데이트에서 더 낮은 값을 삽입하면 먼저 사이드 테이블에서 "I" 연산이 실행되고 그 다음에는 "D" 작업이 실행됩니다. 이렇게 하면 이 행에 대해 잘못된 작업이 반환됩니다. "I" 뒤에 오는 "D"가 "D"로 집계되기 때문입니다.

기본 키 값만 사이드 테이블에 유지 관리되므로 별도의 두 개의 항목이 필요하지 않습니다. 기본 키 열이 업데이트되지 않는 한 마찬가지입니다.

이 문제는 기본이 아닌 고유 열에 대해 해결되었습니다. 이 경우 업데이트가 발생하면 "D"와 "I"가 있는 두 개의 항목 대신 "U"를 업데이트 작업으로 사용하여 하나의 행만 삽입됩니다.

참조 자료

Microsoft에서 소프트웨어 업데이트를 설명하는 데 사용하는 용어 에 대해 알아봅니다.