RDA 충돌 감지 및 보고

Microsoft SQL Server Compact 3.5의 RDA(Remote Data Access)는 밀어넣기 작업을 수행하는 동안 SQL Server를 실행하는 컴퓨터에서 업데이트할 수 없는 행에 대해 제한된 충돌 보고 메커니즘을 제공합니다.

중요

RDA의 충돌 행은 SQL Server Compact 3.5에서 SQL Server 테이블로 밀어넣을 때 오류로 인해 실패하는 삽입, 업데이트 또는 삭제 작업으로 엄격하게 제한 정의됩니다. 다른 사용자가 데이터를 변경하더라도 오류를 일으키지 않을 경우 충돌로 간주되지 않습니다.

RDA는 복제와 같은 방식으로 특정 해결 프로그램을 제공하지는 않지만 SQL Server Compact 3.5에서는 충돌하는 모든 행을 캡처하는 오류 테이블을 제공합니다. Pull 메서드의 일부로서 오류 테이블을 지정할 수 있습니다. 밀어넣는 동안 발생하는 모든 오류는 이 오류 테이블에 기록됩니다. 오류 테이블을 사용하여 충돌 감지 및 보고를 관리하는 응용 프로그램을 개발할 수 있습니다.

서버에 밀어넣은 SQL Server Compact 3.5 데이터베이스에 대한 변경 내용은 수신된 순서대로 적용됩니다. SQL Server 테이블은 마지막 사용자의 변경 내용이 반영되도록 업데이트됩니다.

RDA에서는 행을 SQL Server Compact 3.5에서 SQL Server로 밀어넣을 수 없는 경우 충돌이 발생합니다. RDA는 행 수준의 추적만 지원합니다. 그러므로 Push 메서드에서 선택한 옵션에 따라 일부 행은 성공하고 일부 행은 실패합니다. RDA에서 충돌을 추적하려면 Pull 메서드에서 TRACKINGON 또는 TRACKINGON_INDEXES를 지정합니다.

RDA 추적 테이블을 사용하면 데이터를 전파할 때 테이블을 정확히 필터링하고 안정된 네트워크 연결을 사용함으로써 충돌과 오류를 방지할 수 있습니다.

RDA 충돌이 발생하는 방식

다음과 같은 이유로 행의 변경 내용을 서버에 적용할 수 없습니다.

  • RDA는 장치의 추적된 테이블에서 변경된 각 행의 삽입, 업데이트 및 삭제 작업을 추적합니다. 그러므로 서버의 같은 테이블에 삽입된 행과 동일한 기본 키 값으로 클라이언트에 행을 삽입할 경우 삽입이 이미 발생되었기 때문에 클라이언트에서 밀어넣기 작업이 오류로 인해 실패합니다.

  • 각 사용자에 대해 데이터를 올바르게 분할하지 않은 경우 한 사용자가 행을 업데이트하려고 시도할 때 다른 사용자는 같은 행을 삭제할 수 있습니다.

  • 또한 이전의 밀어넣기 작업이 중단된 경우 오류가 발생하여 행을 서버에 밀어넣을 수 없습니다. 예를 들어 사용자가 삽입 작업을 포함하여 데이터를 서버에 밀어넣기 시작했는데 밀어넣는 동안 네트워크 연결이 손실되는 경우가 있습니다. 그러면 클라이언트는 네트워크 연결이 끊겨서 데이터를 밀어넣을 수 없다는 메시지를 표시합니다. 그러나 실제로는 변경 사항이 서버에 적용되었을 수 있습니다. 이 경우 클라이언트가 네트워크에 다시 연결되어 사용자가 같은 데이터를 다시 밀어넣으려고 시도하면 일부 행은 이전의 밀어넣기 작업에서 이미 삽입되었기 때문에 적용되지 않습니다. 이러한 경우 응용 프로그램은 두 번째 밀어넣기를 기준으로 중복되는 기본 키로 인해 실패한 오류 테이블의 오류를 모두 무시해야 합니다.

오류 테이블

RDA는 오류를 실패한 행과 함께 SQL Server Compact 3.5 데이터베이스의 오류 테이블에 저장하고 반환함으로써 오류로 인해 행을 서버에 적용할 수 없었던 데이터 충돌을 추적합니다. 이 테이블은 Pull 메서드에서 정의합니다. 나중에 밀어넣기 작업을 하는 동안 오류가 발생하면 오류 테이블에 저장됩니다.

Push 메서드를 사용할 때 중복 기본 키와 같은 오류로 인해 행을 서버에 적용할 수 없는 경우 원래 Pull 메서드에서 정의한 오류 테이블 이름을 참조하여 행을 확인합니다. Pull 메서드의 ErrorTableName 속성은 밀어넣기 오류를 저장할 테이블의 이름을 지정합니다. 오류 테이블이 즉시 생성되지만 처음에는 행을 포함하지 않습니다. ErrorTableName은 Pull 메서드에 TRACKINGON 또는 TRACKINGON_INDEXES를 지정할 때만 지정할 수 있습니다.

Push 메서드를 실행하는 동안 행을 적용할 수 없기 때문에 오류가 발생하면 SQL Server Compact 3.5에서 발생하는 각 오류에 대해 테이블에 레코드를 삽입합니다. 기본 테이블의 모든 열과 함께 오류 발생 이유와 시기를 나타내는 열이 3개 추가됩니다. s_ErrorDate 열은 오류가 발생한 날짜와 시간을 지정합니다. s_OLEDBErrorNumber 열은 행을 서버에 적용할 때 발생한 오류의 HResult를 지정합니다. s_OLEDBErrorString 열은 오류에 대한 문자열 설명입니다. Push 메서드가 끝나고 행을 서버에 적용할 때 오류가 발생한 경우 경고(SSCE_WRN_RDAERRORROWSRETURNED, 값 28800)가 응용 프로그램에 보고되며 응용 프로그램에서는 오류 테이블을 검사하여 오류의 원인을 확인합니다.

오류 테이블 유지 관리

연결된 RDA 추적 테이블을 삭제하면 오류 테이블에 행이 있더라도 오류 테이블이 자동으로 삭제됩니다. 개발자는 서버에 적용할 수 없기 때문에 충돌로 간주되는 행을 확인해야 합니다.

원래 데이터를 서버에 밀어넣을 때 발생한 오류를 정확히 해결하려면 장치에서 데이터를 새로 고쳐야 할 수 있습니다. 추적된 테이블을 삭제할 때 데이터가 손실되지 않도록 오류 테이블에서 데이터를 캐시하는 것이 좋습니다. 또는 원래 추적 테이블과 이름이 다른 테이블에 새로 고친 데이터를 밀어넣을 수도 있습니다.

데이터를 밀어넣은 후 오류 확인

실패한 행과 함께 오류 테이블에 저장된 오류 정보를 보면 서버에 대한 행 삽입, 업데이트 또는 삭제 실패 이유를 확인할 수 있습니다. 오류에 따라 서버에서 데이터의 현재 상태를 알아야 할 경우가 있습니다. 추적된 테이블을 삭제하면 오류 테이블이 삭제되므로 응용 프로그램을 구축하여 이러한 상황을 처리해야 합니다.

오류 및 일괄 처리가 아닌 트랜잭션

일괄 처리가 아닌 트랜잭션(Push 메서드를 사용할 경우 BATCHINGOFF 옵션)을 실행하는 동안 행 수준에서 충돌이 발견되었습니다. 충돌 행은 응용 프로그램으로 반환되어 지정된 오류 테이블에 저장됩니다. 예를 들어 응용 프로그램에서 유효하지 않은 SQL Server에 행을 밀어넣으려고 시도할 경우 이 행은 응용 프로그램으로 반환되어 충돌을 나타내는 오류 메시지와 함께 오류 테이블에 저장됩니다.

충돌하는 행이 오류 테이블에 반환되면 이 행은 원래 테이블에서 제거됩니다. 테이블이 원래 상태로 남아 있지 않기 때문에 발생한 충돌을 해결하기가 더 어렵습니다. 그러므로 충돌하는 데이터를 사용자가 수정할 수 있도록 응용 프로그램을 디자인해야 합니다. 이러한 응용 프로그램을 디자인하려면 서버에서 테이블을 다시 밀어넣어서 문제를 정확히 해결해야 합니다.

장치에서 이 테이블을 삭제하면 오류 테이블이 삭제됩니다. 오류 테이블의 행을 임시 위치로 캐시하거나 서버에서 다른 테이블로 데이터를 밀어넣어야 합니다. SQL Server Compact 3.5 데이터베이스의 테이블에서 잘못된 행이 외부로 이동되므로 정확한 서버 데이터로 테이블을 다시 새로 고쳐야 합니다. 실패한 행이 원래 업데이트된 행인 경우 이후의 밀어넣기 작업에서 성공할 수 있도록 같은 행으로 다시 업데이트해야 합니다. 행을 업데이트했지만 서버에서 행이 삭제된 경우 삽입이 성공하려면 행을 테이블에 다시 추가하고 밀어넣어야 합니다.

오류 및 일괄 처리 트랜잭션

RDA는 전체 밀어넣기를 처리하려면 모든 행이 성공해야 하는 일괄 처리 밀어넣기(Push 메서드를 사용할 경우 BATCHINGON 옵션)도 지원합니다. 행 하나가 실패하면 전체 밀어넣기 트랜잭션이 실패하며 데이터도 업데이트되지 않습니다. 충돌하는 행이 오류 테이블로 복사됩니다. 이 옵션은 충돌을 더 쉽게 해결하는 메커니즘이기 때문에 기본 설정 옵션입니다. 일괄 처리가 아닌 밀어넣기와는 달리 원래 Microsoft Windows CE 기반 데이터베이스는 그대로 남아 있습니다. 사용자가 충돌하는 데이터를 수정하고 원래 Windows CE 기반 데이터베이스로 다시 병합할 수 있도록 응용 프로그램을 디자인해야 합니다. 원래 행이 그대로 남아 있기 때문에 행을 정확히 확인하기 위해 오류에 따라 서버 데이터를 곧바로 다시 밀어넣지 않아도 되는 경우가 있습니다. 예를 들어 무결성 위반으로 인해 행이 실패한 경우 장치의 행을 업데이트하고 Push 메서드를 호출하여 데이터를 서버로 밀어넣을 수 있습니다. 또한 이 옵션을 사용하면 충돌하는 행을 복사하기 전에 오류 테이블이 자동으로 지워지기 때문에 더욱 명확하게 유지 관리할 수 있습니다. 이 테이블에는 마지막 밀어넣기 작업의 충돌만 있습니다.