我使用VS 2010高级RTMRel (10.0.30319.1)和SS2008。我有一个数据库,它构建AOK,并有一个后部署脚本,它加载一些示例数据。当我通过VS UI构建和部署这个DB时,它工作得很好。当我试图通过vsdbcmd部署它时,它会在数据填充上失败,错误如下:
** * SQL01268 C:\source\mydatabase.sql (5197,0) .Net SqlClient数据提供程序: Msg 2627,14级,State 1,第227行违反主键约束'pk_customers‘。无法在对象'dbo.customers'.**中插入重复密钥
为了演示的目的,我试图将一条特定的记录填充到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列(通过使用)吗?
不,不可能已经有id = 10001的customers表中的记录。表中根本没有其他记录(或插入)。
我认为错误消息中的“复制键”部分是完全错误的,它反对我将自己的值放入PK列中。
PK约束具有标准的默认值。如果更改默认值并设置IGNORE_DUP_KEY = ON,则命令行deploy工作。但我不想那么做。
任何见解或建议都值得赞赏。
发布于 2011-02-01 20:58:48
好吧,很丢人。
结果发现,我的部署后脚本有一个USE语句,用于指定默认的DB名称(称为MobileDB)。当我通过UI构建时,我也使用了这个MobileDB名称,部署配置总是重新创建数据库,所以一切都很好。
但是,当我从vsdbcmd部署时,我使用的是一个随机的DB名称(比如ChickenSoup)。因此,当数据填充脚本运行时,它试图写回MobileDB,击中已经存在的数据,并违反PK约束而失败。
典型的用户错误。
https://stackoverflow.com/questions/4863958
复制相似问题