【发布时间】:2016-11-18 19:34:34
【问题描述】:
我有一张这样的桌子:
CREATE TABLE [dbo].[RequestQueue]
(
[QueueID] [BIGINT] IDENTITY(1,1) NOT NULL,
[EntryDate] [DATETIME] NULL
CONSTRAINT [DF_SecurityQueue_EntryDate] DEFAULT (GETDATE()),
[AsOfDate] [DATE] NULL,
[ItemID] [VARCHAR](32) NULL,
[ItemType] [VARCHAR](50) NULL,
[Message] [VARCHAR](MAX) NULL,
CONSTRAINT [PK_QueueID]
PRIMARY KEY CLUSTERED ([QueueID] ASC)
WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF,
IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON,
ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
我有一个每天运行的SQL作业,往这个表中插入数据,插入语句是这样的:
INSERT INTO dbo.RequestQueue( AsOfDate , ItemID , ItemType )
VALUES ( GETDATE(),'ABC1','TYPE1' )
这项日常工作运行了一年多,直到昨晚它中断并显示以下消息:
消息 2627,第 14 级,状态 1,第 25 行
违反主键约束“PK_QueueID”。无法在对象“dbo.RequestQueue”中插入重复键。重复键值为 (1698922)。
我检查了身份值如下:
SELECT IDENT_CURRENT('dbo.RequestQueue')
返回 1698922
SELECT MAX([QueueID])
FROM [dbo].[RequestQueue]
返回 1699269
IDENT_CURRENT 出了什么问题?
SQL 作业按每日计划运行,每天运行一次。
RequestQueue 表有一些并发读取器,它们也会发出更新语句,但当然不会在 PK 列上。
在其他任何地方都没有其他插入作业/进程。
【问题讨论】:
-
会不会是用户手动插入记录?
-
没有手动插入,也没有其他自动化过程。此表位于业务敏感数据库上,有多层控制可防止手动数据操作。
-
表上是否有插入触发器?
-
您的身份似乎因隔离级别而被卡住 - 代码运行在什么隔离级别 - 未提交读取?
-
读取已提交。
标签: sql sql-server tsql