нарушение ограничения первичного ключа, только при развертывании БД через vsdbcmd - PullRequest
2 голосов
/ 01 февраля 2011

Я использую VS 2010 Premium RTMRel (10.0.30319.1) и SS2008.У меня есть база данных, которая создает AOK и сценарий после развертывания, который загружает некоторые примеры данных.Когда я собираю и внедряю эту БД через интерфейс VS, она работает просто отлично.Когда я пытаюсь развернуть его через vsdbcmd, происходит сбой в массиве данных с такими ошибками:

** * SQL01268 C: \ source \ mydatabase.sql (5197,0) .Net SqlClient DataПоставщик: Сообщение 2627, уровень 14, состояние 1, строка 227 Нарушение ограничения PRIMARY KEY 'pk_customers'.Невозможно вставить дубликат ключа в объект 'dbo.customers'. **

В демонстрационных целях я пытаюсь заполнить конкретную запись в таблице клиентов и переопределяю IDENTITYсвойство столбца id для установки значения по моему выбору.Соответствующие строки в моем сценарии после развертывания таковы:

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

Кто-нибудь знает, почему я могу переопределить столбец IDENTITY (используя SET IDENTITY INSERT ON) через пользовательский интерфейс, но не через командную строку?

И нет, невозможно, чтобы в таблице клиентов уже была запись с id = 10001. Других записей (или вставок) в таблице нет вообще.

IПолагайте, что часть сообщения об ошибке «дубликат ключа в объекте» является абсолютно неверной, и что он возражает против того, чтобы я пытался поместить свое собственное значение в столбец PK.,Если я изменю значения по умолчанию и установлю IGNORE_DUP_KEY = ON, то развертывание командной строки работает.Но я не хочу этого делать.

Любые идеи или предложения приветствуются.

1 Ответ

1 голос
/ 01 февраля 2011

ОК, смущает.

Оказалось, что в моем сценарии после развертывания был оператор USE, в котором указывалось имя БД по умолчанию (назовите его MobileDB).Когда я строил с помощью пользовательского интерфейса, я также использовал это имя MobileDB, конфигурация развертывания всегда воссоздала базу данных, и поэтому все работало нормально.

Однако при развертывании из vsdbcmd я использовал случайныйИмя БД (например, ChickenSoup).Поэтому, когда выполнялся сценарий заполнения данных, он пытался записать обратно в MobileDB, ударил данные, которые уже были там, и завершился неудачей с нарушением ограничения PK.

Классическая ошибка пользователя.

...