нарушение ограничения первичного ключа, только при развертывании БД через vsdbcmd

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

** * SQL01268 C:\source\mydatabase.sql (5197,0) Поставщик данных .Net SqlClient: сообщение 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) через пользовательский интерфейс, но не через командную строку?

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

Я считаю, что часть сообщения об ошибке «повторяющийся ключ в объекте» совершенно неверна и что она возражает против того, чтобы я пытался поместить свое собственное значение в столбец PK.

Ограничение PK имеет стандартные значения по умолчанию. Если я изменю значения по умолчанию и установлю IGNORE_DUP_KEY = ON, то развертывание из командной строки будет работать. Но я не хочу этого делать.

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


person soo    schedule 01.02.2011    source источник


Ответы (1)


Хорошо, смущает.

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

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

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

person soo    schedule 01.02.2011