Eu tenho uma log
tabela com uma ID
coluna de identidade. Tudo funciona bem por anos; então, ontem, vejo o seguinte erro nos logs:
A instrução foi encerrada.
Violação da restrição PRIMARY KEY 'PK__log__ID__3B40CD36'. Não é possível inserir chave duplicada no objeto 'dbo.log'. O valor da chave duplicada é (295992).INSERT INTO log (datum, zeit, benutzer, modul, prozedur, code, zeile, bez1, bez2, tech_info) VALUES ('20151126 00:00:00.000', '19000101 18:26:45.121', 'Customer', '' , '', 'WShop-Trans', 0, '1 Datensätze für Tabelle adresse gesendet.', '', '')
Eu verifiquei a semente IDENTITY e parece OK:
Consulta: DBCC CHECKIDENT(log)
Resultado: Verificando informações de identidade: valor de identidade atual '296021', valor de coluna atual '296021'.
Execução DBCC concluída. Se o DBCC imprimir mensagens de erro, entre em contato com o administrador do sistema.Consulta: SELECT MAX(ID) FROM log
Resultado: 296021
Não há gatilhos na tabela e ninguém está mexendo com os valores iniciais (sou eu quem administra o servidor de banco de dados, então tenho certeza disso).
Até agora, este é um evento único e não posso reproduzi-lo.
Parece apenas uma falha do SQL Server, mas estou curioso: isso é um bug conhecido ou existe alguma outra explicação plausível para isso? A versão do SQL Server é Microsoft SQL Server 2012 - 11.0.2100.60 (X64)
.
Para completar, aqui está o script de tabela completo:
CREATE TABLE [log](
[datum] [datetime] NULL,
[ID] [int] IDENTITY(1,1) NOT NULL,
[zeit] [datetime] NULL,
[benutzer] [varchar](255) NULL,
[modul] [varchar](255) NULL,
[prozedur] [varchar](255) NULL,
[code] [varchar](255) NULL,
[zeile] [int] NULL,
[bez1] [text] NULL,
[bez2] [text] NULL,
[tech_info] [text] NULL,
[pc_name] [varchar](255) NULL,
[app_name] [varchar](255) NULL,
[s_insert_user] [nvarchar](255) NULL,
[s_insert_dat] [datetime] NULL,
[s_update_user] [nvarchar](255) NULL,
[s_update_dat] [datetime] NULL,
[fs_mandant] [uniqueidentifier] NULL,
CONSTRAINT [PK__log__ID__3B40CD36] PRIMARY KEY CLUSTERED ([ID] ASC)
)
CREATE NONCLUSTERED INDEX [code] ON [log] ([code] ASC)
CREATE NONCLUSTERED INDEX [datum_zeit] ON [log] ([datum] ASC, [zeit] ASC)
CREATE NONCLUSTERED INDEX [fs_mandant] ON [log] ([fs_mandant] ASC)
CREATE NONCLUSTERED INDEX [modul] ON [log] ([modul] ASC)
Como a pergunta afirma que o SQL Server 2012 RTM (build 2100) está em uso, é provável que este bug:
CORREÇÃO: o objeto de sequência gera valores de sequência duplicados quando o SQL Server 2012 ou o SQL Server 2014 está sob pressão de memória
que diz:
Observe que
IDENTITY
usa o mecanismo de objeto de sequência no SQL Server 2012 e posterior.O problema foi corrigido pela primeira vez em: