我遇到了一个奇怪的问题,我需要一些帮助来解决这个问题。
我有一个数据库,除了所有应用程序数据列之外,它还有一个 ID 列(定义为 int not null,Identity,从 1 开始,递增 1)。该表的主键是 ID 列,没有其他组件。
没有一组数据可以用作“自然主键”,因为应用程序必须允许多次提交相同的数据。
我有一个存储过程,这是将新记录添加到表中的唯一方法(除了直接以数据库所有者身份登录服务器)
今天早上 QA 测试应用程序时,他们在数据库中输入了一条新记录(按预期使用应用程序,并且正如他们过去两周一直在做的那样),并在该表上遇到了主键冲突。
这与我 10 年来一直在做主键的方式相同,但从未遇到过这种情况。
有想法该怎么解决这个吗?或者这是那些偶尔出现的宇宙射线故障之一。
感谢您提供的任何建议。
奈杰尔
编辑于美国东部时间 6 月 12 日下午 1:15,以提供更多信息
架构的简化版本...
CREATE TABLE [dbo].[tbl_Queries](
[QueryID] [int] IDENTITY(1,1) NOT NULL,
[FirstName] [varchar](50) NOT NULL,
[LastName] [varchar](50) NOT NULL,
[Address] [varchar](150) NOT NULL,
[Apt#] [varchar](10) NOT NULL
... <12 other columns deleted for brevity>
[VersionCode] [timestamp] NOT NULL,
CONSTRAINT [PK_tbl_Queries] PRIMARY KEY CLUSTERED
(
[QueryID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
(还删除了默认值语句)
存储过程如下
insert into dbo.tbl_Queries
( FirstName,
LastName,
[Address],
[Apt#]...) values
( @firstName,
@lastName,
@address,
isnull(@apt, ''), ... )
它甚至不看身份列,不使用 IDENTITY、@@scope_identity 或类似的东西,它只是一个文件,然后忘记。
我尽可能确信身份值没有被重置,并且没有其他人使用直接数据库访问来输入值。在这个项目中唯一一次使用身份插入是在初始数据库部署中设置查找表中的特定值。
QA 团队在收到错误后立即再次尝试,并且能够成功提交查询,此后他们一直在尝试重现它,但到目前为止还没有成功。
我真的很欣赏这些想法。