2009-06-12 7 views
4

이상한 문제가 발생하며이를 파악하는 데 도움이 필요합니다.Sql Server 2005 ID 열의 기본 키 위반

모든 응용 프로그램 데이터 열 외에 ID 열 (null이 아닌 int, Identity, 1에서 시작, 1 씩 증가 함)로 정의 된 데이터베이스가 있습니다. 테이블의 기본 키는 ID 열이며 다른 구성 요소는 없습니다.

응용 프로그램에서 동일한 데이터를 여러 번 제출해야하므로 "기본 기본 키"로 사용할 수있는 데이터 집합이 없습니다.

I가 (DB를 소유자로 직접 서버에 로그인 이외의) 테이블에 새 레코드를 추가 할 수있는 유일한 방법입니다 저장 프로 시저,

QA 오늘 아침 응용 프로그램을 테스트하는 동안, 그들은에 데이터베이스에 새 레코드를 입력하고 (응용 프로그램을 의도 한대로 사용하고 지난 2 주 동안 수행 한 것처럼)이 테이블에서 기본 키 위반이 발생했습니다.

이것은 약 10 년 동안 기본 키를 사용했던 것과 같은 방식으로이 작업을 한 번도 해본 적이 없습니다.

해결 방법에 대한 의견이 있으십니까? 아니면 오랫동안 한 번 나타 났던 우주 광선 결함 중 하나입니다.

조언 해 주셔서 감사합니다. 자세한 내용

에게 스키마의 단순화 된 버전을 제공하기 위해, 동부 서머 타임 오후 1시 15분 6 월 12에서 편집

이 ...

CREATE TABLE [dbo].[tbl_Queries](
[QueryID] [int] IDENTITY(1,1) NOT NULL, 
[FirstName] [varchar](50) NOT NULL, 
[LastName] [varchar](50) NOT NULL, 
[Address] [varchar](150) NOT NULL, 
[Apt#] [varchar](10) NOT NULL 
    ... <12 other columns deleted for brevity> 
[VersionCode] [timestamp] NOT NULL, 
CONSTRAINT [PK_tbl_Queries] PRIMARY KEY CLUSTERED 
(
    [QueryID] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 

(또한 기본값 문을 제거) 나이젤

저장 프로 시저는 다음과 같습니다.

insert into dbo.tbl_Queries 
    ( FirstName, 
     LastName, 
     [Address], 
     [Apt#]...) values 
    ( @firstName, 
     @lastName, 
     @address, 
     isnull(@apt, ''), ...) 

IDENTITY, @ scope_identity 또는 이와 유사한 것을 사용하지 않는 ID 열도 보지 않습니다. 단지 파일이며 잊어 버립니다.

신원 값이 재설정되지 않았으며 아무도 직접 데이터베이스 액세스를 사용하여 값을 입력 할 수 없다고 확신합니다. ID 삽입이 사용되는이 프로젝트의 유일한 시간은 초기 데이터베이스 배포에서 조회 테이블에 특정 값을 설정하는 것입니다.

QA 팀은 오류가 발생하자마자 다시 시도하고 쿼리를 성공적으로 제출할 수 있었으며 그 이후로이를 재현하려고 시도했지만 지금까지 성공하지 못했습니다.

정말 아이디어에 감사드립니다.

경험

에 따라

+0

흠 ... 혹시 당신은 위생 테이블 스키마 및/또는 문제가되는 삽입 문을 붙여 넣을 수 있습니까? – ristonj

+0

여전히 새 레코드를 추가 할 수 없습니까 아니면 한 번만 발생 했습니까? –

+0

나이젤 아래 내 대답을 확인하십시오 ... – Eric

답변

1

임의의 생각은 당신이 말과 데이터를 동기화 된 적이, 레드 게이트 데이터 비교. ID 열을 다시 시드 할 수있는 옵션이 있습니다. 사용에 문제가 발생했습니다. 그리고 지난 달 또 다른 프로젝트.

ID를 명시 적으로로드하거나 동기화했을 수도 있습니다.

+0

아니, 이건 약 2 주 전에 QA를 위해 특별히 데이터베이스 설정에서 일어난. 데이터베이스는 VSTS Team Suite, 2008 버전에서 배포되었으며 500 개의 생성 된 레코드로 채워졌습니다. 그 이후로 그들은 문제점 보고서 전후에 약 50 개의 레코드를 추가했습니다. – Nigel

+0

누군가가 DBCC CHECKIDENT 또는 SET IDENTITY_INSERT를 실행했습니다. – gbn

4

잠재적 원인에 대한 설명이 없지만 신원 열의 시드 값을 변경할 수 있습니다. 씨앗이 테이블에 다음 값이 이미 존재할 곳으로 낮춰지면, 그것은 분명히보고있는 것을 야기 할 수 있습니다. DBCC CHECKIDENT (table_name)을 실행하여 무엇이 제공되는지 확인하십시오.

자세한 내용은 신원 씨가 손상 또는 어떻게 든 다시있어 같은 this page

+0

네, 저도 첫 반응을 보였습니다. 테이블은 아마 놀았고 IDENTITY 값은 재설정되었습니다. –

+1

누군가가 SET IDENTITY_INSERT ON이 켜진 상태에서 테이블에 값을 삽입했습니다. –

+0

감사합니다 아담, 나는 그 명령을 알지 못했지만 도움이되지 않았습니다. 현재 값을 550으로 표시하고 열 최대 값을 550으로보고 있으며 이는 내가보고있는 것과 일치합니다. – Nigel

6

는 소리 확인하십시오. 가장 쉬운 해결책은 식별 컬럼의 현재 최대 값으로 종자를 재설정하는 것입니다 :

DECLARE @nextid INT; 
SET @nextid = (SELECT MAX([columnname]) FROM [tablename]); 
DBCC CHECKIDENT ([tablename], RESEED, @nextid); 
+1

직접 실행 해 보셨습니까? 이제까지? – gbn

+1

나는 내 진술을 테스트하지 않았으므로, 다시 작성했다. –

+0

나는 이것을 두 번째 것이다. 씨앗이 롤백되지 않으면 값을 복제 할 방법이 없습니다. 내가 부패가 일어난 것 같아요하지만 SQL을 10 년 동안 사용하고 낮은 디스크 공간 시나리오에서 한 번만 손상을 본 적이있다 –

0

어쩌면 누군가가 직접 명시 적으로 새로운 ID를 사용하여 서버에 로그인 일부 레코드를 삽입 후 신원 자동 증가 필드에 도달했을 때이 번호가 기본 키 위반이 발생했습니다.

하지만 우주선이 좋은 설명 너 한테이다

)

0

당신이 그냥 저장 프로 시저에 매우 확실 ... 당신이 IDENTITY_INSERT를 사용하지 않는를 만들기 위해? 일부 논리는 다음과 같습니다.

declare @id int; 
Set @id=Select Max(IDColumn) From Sometable; 
SET IDENTITY_INSERT dbo.SomeTable ON 
Insert (IDColumn, ...others...) Values (@id+1, ...others...); 
SET IDENTITY_INSERT dbo.SomeTable OFF 
. 
. 
. 

단지 타이핑 만하는 것처럼 느낍니다. 그러나 때때로 잠시 후 여러분은 Identity 열이 무엇에 관한 것인지 완전히 이해하지 못하는 사람들을 뛰어 다니며 이것이 배제되었는지 확인하고자합니다. 그건 그렇고 : 이것이 대답이라면, 질문을 삭제하고 이것이 당신 문제라고 결코 인정하지 않으면 나는 당신을 반대하지 않을 것입니다!

매년 여름에 인턴 사원을 고용 할 수 있습니까?

+0

예, 확인했는데 저장된 procs에는 IDENTITY_INSERT가 없습니다. 내가 찾은 유일한 위치는 조회 데이터 (문제가있는 테이블과 다른 테이블)를 채우기 위해 실행되는 초기 쿼리에있었습니다. – Nigel

0

@@ identity 또는 scope_identity()와 같은 함수를 프로 시저에서 사용하고 있습니까? 테이블 트리거 또는 여러 삽입이있는 경우 당신이 희망하는 경우가 당신이

+0

이것은 명시 적 ID 값을 삽입하지 않는 한, 데이터 손상을 일으키지 만, 식별 컬럼이있는 테이블의 기본 키 위반이 아닙니다. –

0

기본 키 위반이 반드시 해당 테이블에서 오는 것은 아닙니다.

응용 프로그램이 다른 테이블을 만지거나 해당 기능에 대한 다른 저장 프로 시저를 호출합니까? 테이블에 트리거가 있습니까? 또는 저장 프로 시저 자체가 다른 테이블이나 저장 프로 시저를 사용합니까?

특히 감사 테이블이나 트리거로 인해 발생할 수 있습니다.

+0

서버에서받은 오류 메시지는 오류를 던지고있는 것이이 테이블임을 지정했습니다. 저장 프로시 저는 다른 테이블을 건드리지 않으며 다른 저장 프로 시저를 호출하지 않습니다. 업데이트 트리거가 있지만 처음에는 업데이트가 실제로 업데이트인지 (즉, 삭제 된 의사 테이블이 비어 있지 않은지) 확인합니다. 나는 이것을 우주 광선에 맞추기로 할 것이라고 생각한다. (내 매니저는 그것이 재현 불가능하기 때문에 그것이 돌아 오지 않는 한 무시할 수 있다고 동의한다.) – Nigel