2010-03-16 6 views
5

LUW에서 DB2 v9를 사용 중입니다.IDENTITY 열에 사용될 다음 값을 얻는 방법

I는 다음과 같이 정의 된 열이 :

"ID" BIGINT NOT NULL GENERATED BY DEFAULT
AS IDENTITY (START WITH 1, INCREMENT BY 1, CACHE 20,
NO MINVALUE, NO MAXVALUE, NO CYCLE, NO ORDER),

나는 다음 값이 레코드가 테이블에 삽입 된 ID 열 다음에 시간이 있다는 것을 결정하는 가장 좋은 방법을 알고 싶습니다 .

이 정보를 사용하여 IDENTITY가 그대로 유지되고 그 다음 값이 ID 열의 가장 높은 값보다 큰 테이블에서 "온 전성"검사를 수행하는 스크립트를 작성합니다.

나는 맹목적으로 값을 재설정하고 싶지 않습니다. 표가 정상 상태 확인을 통과하지 못하면 알림을 받기 위해 IDENTITY가 "해킹당하는"원인을 파악할 수 있습니다.

+0

데이터베이스를 사용하지 않는 동안 오프라인 테스트를 수행하기위한 것입니다. 테스트가 실행되는 동안 사람들이 레코드 삭제를 삽입하는 데는 아무런 문제가 없습니다. –

답변

1

다음 신원을 확인할 수 없습니다. 새 레코드를 만들 때까지 데이터가 동기화되지 않을 위험이 있습니다. 수행 할 수있는 유일한 작업은 새 레코드를 만들고 새 ID를 얻은 다음 확인을 수행 한 다음 나머지 데이터로 레코드를 업데이트하는 것입니다.

SELECT IDENT_CURRENT ('yourtablename')를 사용하여 마지막으로 생성 된 항목을 가져올 수 있습니다. 위와 동일한주의 사항이 있습니다. 이는 T-SQL에서 작동하며 DB2의 맛은 확실하지 않습니다.

+0

새로운로드의 경우 이전 ID가 없었기 때문에 이전 ID가 작동한다고 생각하지 않습니다. 재 시드가 이전 신원을 설정하지 않는다면? –

+0

새 레코드를 만드는 것에 대한 아이디어가 효과가있을 수 있습니다. 나는 비록 기록을 채우고 싶지 않다. 이것은 단지 수표이며 기록 작성에 관여하지 않습니다. 새 레코드를 만들고 식별 열의 값을 얻은 다음 롤백을 수행 할 수있었습니다. 누구든지 롤백을 수행하면 시드 값에서 롤백을 수행하는지 여부를 알고 있습니까? 차라리 테스트를 실행할 때마다 시드 값이 증가하지 않을 것입니다. –

+0

이것은 갈 길입니다. 간격에 대해 걱정하지 마십시오. 부호없는 32 비트 정수를 사용하는 경우에도 실행하기 전에 초당 1000 행을 하루 24 시간 동안 136 년 동안 삽입 할 수 있습니다. –

1

예상대로 작동하지 않을 것이라고 생각합니다. 행이 삽입 된 다음 다른 행이 삽입되기 전에 해당 행이 삭제되는 경우를 생각해보십시오. 이 시점에서 자동 생성 된 ID는 DB의 가장 높은 값보다 2 크고 올바른 값을 갖습니다. 삭제가 발생하지 않는다고 보장 할 수 있다면 작동 할 수도 있지만 사용 방법을 잘 모르겠습니다.

본질적으로 DB 소프트웨어의 기본 작업이 작동하는지 확인하고 있습니다. 그렇지 않은 경우 무엇을 할 예정입니까? 공급 업체를 변경 하시겠습니까?

단순히 ID 열을 다시 시드하려는 경우 select max (id)를 수행하고 동일한 트랜잭션 내에서 열을 다시 시드하십시오. 직렬화 가능 격리 수준 트랜잭션 의미를 적용하여 열을 다시 시드하는 동안 새 레코드가 삽입되지 않도록 할 수 있습니다.

+0

DB2의 기본 조작이 작동하는지 점검하지 않습니다. 내가 잡을 수있는 예는 부적절하게 실행 된로드 조작입니다. 비즈니스 시작 전 스크립트를 매일 실행할 수 있습니다.문제가 발견되면 누가 영향을받는 테이블을 변경했는지 추적하고 데이터를로드하는 적절한 방법에 대해 논의 할 수 있습니다. 삭제되는 데이터의 경우 몇 가지 오 탐지 (false positives)를 받게되어 기쁩니다. 만약 내가 너무 많은 오 탐률을 얻으면 나는 1보다 큰 범위를 테스트 할 수 있습니다. –

+0

@ 마이클 - 누군가가 신원 삽입을 켜고 마지막 열보다 높은 값을 설정하기 위해 칼럼을 다시 채우는 것을 잊어 버릴지도 모른다고 말하는 것입니다 그들이이 후 삽입 했습니까? 최대 ID 값을 읽고, "유효한"데이터가 포함 된 삽입을 수행하고, 성공했는지 또는 실패했는지를 확인하고 관찰 한 ID보다 큰 ID를 가진 다음 해당 행을 삭제하면이 작업을 테스트 할 수 있습니다. 이것은 시퀀스에 몇 개의 "빈"ID를 가져 오지만 설명 된 문제의 종류를 감지합니다. – tvanfosson

+0

네, 그게 내가 함정에 빠뜨리는 문제의 유형입니다. 나는 누군가가 빈 ID를 만들지 않는 해결책을 원하기를 바라고있다. 스크립트를 실행할 때마다 빈 ID로 끝나면 결국 세상 끝이 아니 겠지만, 이상하게도 나는 그것을 피하고 싶습니다. –

0

ID 열이 GENERATED BY로 설정된 경우 부적절한로드/가져 오기로 문제가 발생하지 않습니다. 또한 IDENTITY_VAL_LOCAL 함수를 사용하여 ID 값을 가져올 수 있습니다.
here

관련 문제