2011-02-01 3 views
2

VS 2010 Premium RTMRel (10.0.30319.1) 및 SS2008을 사용하고 있습니다. AOK를 구축하고 일부 샘플 데이터를로드하는 사후 배치 스크립트가있는 데이터베이스가 있습니다. VS UI를 통해이 DB를 빌드하고 배포하면 정상적으로 작동합니다. vsdbcmd를 통해 배포하려고하면 다음과 같은 오류가있는 데이터 채우기가 실패합니다.기본 키 제약 조건 위반, vsdbcmd를 통해 DB를 배포 할 때만

** * SQL01268 C : \ source \ mydatabase.sql (5197,0) .Net SqlClient 데이터 공급자 : Msg 2627 , 수준 14, 상태 1, 줄 227 PRIMARY KEY 제약 조건 'pk_customers'위반. 'dbo.customers'개체에 중복 키를 삽입 할 수 없습니다. 데모 목적을 위해 * *

, 나는 고객 테이블에 특정 레코드를 채우기 위해 노력하고 내 선택의 값을 설정하기 위해 id 컬럼의 IDENTITY 속성을 무시하고있다. 내 배포 후 스크립트의 관련 라인은 다음과 같습니다

SET IDENTITY_INSERT [dbo].[customers] ON 
INSERT INTO [dbo].[customers] ([id], [name], [notes]) VALUES (10001, N'ABC Co', NULL) 
SET IDENTITY_INSERT [dbo].[customers] OFF 
나는 UI를 통해 (SET IDENTITY INSERT ON을 사용하여)에 IDENTITY 열을 무시할 수 있지만 명령 행을 통해 할 수있는 이유

사람이 알고 있나요?

아니요. id = 10001 인 고객 테이블에 이미 레코드가있을 가능성은 없습니다. 테이블에 다른 레코드 (또는 삽입)가 전혀 없습니다.

"개체의 중복 키"부분이 완전히 잘못되어 PK 열에 자신의 값을 넣으 려하지 않는다고 생각합니다.

PK 제약 조건에는 표준 기본값이 있습니다. 기본값을 변경하고 IGNORE_DUP_KEY = ON으로 설정하면 명령 행 배포가 작동합니다. 그러나 나는 그것을하고 싶지 않습니다.

감사 인사 또는 제안 사항.

답변

1

OK, embarassing.

배포 후 스크립트에 기본 DB 이름 (MobileDB)을 지정하는 USE 문이 있음이 밝혀졌습니다. UI를 통해 구축 할 때도이 MobileDB 이름을 사용하고 있었으며 배포 구성은 항상 데이터베이스를 다시 작성하므로 모든 것이 잘 수행되었습니다.

그러나 vsdbcmd에서 배포 할 때 임의의 DB 이름 (예 : ChickenSoup)을 사용하고있었습니다. 따라서 데이터 채우기 스크립트가 실행되면 MobileDB에 다시 쓰기를 시도하고 이미 있던 데이터를 치고 PK 제약 조건 위반으로 실패했습니다.

클래식 사용자 오류입니다.