2

我正在使用 VS 2010 Premium RTMRel (10.0.30319.1) 和 SS2008。我有一个构建 AOK 的数据库,并有一个加载一些示例数据的部署后脚本。当我通过 VS UI 构建和部署这个数据库时,它工作得很好。当我尝试通过 vsdbcmd 部署它时,它在数据填充上失败,并出现如下错误:

** * SQL01268 C:\source\mydatabase.sql (5197,0) .Net SqlClient 数据提供者:消息 2627,级别 14,状态 1,第 227 行违反主键约束“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 而不是通过命令行覆盖 IDENTITY 列(通过使用 SET IDENTITY INSERT ON)?

不,客户表中不可能已经存在 id = 10001 的记录。表中根本没有其他记录(或插入)。

我相信错误消息的“对象中的重复键”部分是完全错误的,并且它反对我试图将我自己的值放入 PK 列。

PK 约束具有标准默认值。如果我更改默认值并设置 IGNORE_DUP_KEY = ON,则命令行部署有效。但我不想这样做。

任何见解或建议表示赞赏。

4

1 回答 1

1

好吧,尴尬。

原来,我的部署后脚本有一个 USE 语句,它指定了默认数据库名称(称为 MobileDB)。当我通过 UI 构建时,我也使用了这个 MobileDB 名称,部署配置总是重新创建数据库,所以一切正常。

但是,当我从 vsdbcmd 部署时,我使用的是随机数据库名称(如 ChickenSoup)。因此,当数据填充脚本运行时,它试图写回 MobileDB,命中已经存在的数据,并因违反 PK 约束而失败。

经典用户错误。

于 2011-02-01T20:58:48.690 回答