Plötzlicher Verstoß gegen PRIMARY KEY in der Spalte IDENTITY

7

Ich habe eine logTabelle mit einer IDIdentitätsspalte. Alles funktioniert seit Jahren gut; dann sehe ich gestern den folgenden Fehler in den Protokollen:

Die Anweisung wurde beendet.
Verletzung der PRIMARY KEY-Einschränkung 'PK__log__ID__3B40CD36'. Doppelter Schlüssel kann nicht in Objekt 'dbo.log' eingefügt werden. Der doppelte Schlüsselwert ist (295992).

INSERT INTO log (Datum, Zeit, Verwendung, Modul, Prozedur, Code, Zeile, Bez1, Bez2, Tech_info) VALUES ('20151126 00: 00: 00.000', '19000101 18: 26: 45.121', 'Kunde', '' , '', 'WShop-Trans', 0, '1 Datensätze für Tabelle adresse Bewertungen.', '', '')

Ich habe den IDENTITY-Startwert überprüft und er sieht in Ordnung aus:

Abfrage: DBCC CHECKIDENT (Protokoll)

Ergebnis: Überprüfung der Identitätsinformationen: aktueller Identitätswert '296021', aktueller Spaltenwert '296021'.
DBCC-Ausführung abgeschlossen. Wenn DBCC Fehlermeldungen gedruckt hat, wenden Sie sich an Ihren Systemadministrator.

Abfrage: SELECT MAX (ID) FROM log

Ergebnis: 296021

Es gibt keine Auslöser in der Tabelle, und niemand spielt mit den Startwerten herum (ich bin derjenige, der den Datenbankserver verwaltet, daher bin ich mir ziemlich sicher).

Bisher ist dies ein einmaliges Ereignis, und ich kann es nicht reproduzieren.

Ich sehe aus wie ein SQL Server-Fehler, bin aber neugierig: Ist dies ein bekannter Fehler oder gibt es eine andere plausible Erklärung dafür? Die SQL Server-Version ist Microsoft SQL Server 2012 - 11.0.2100.60 (X64).

Der Vollständigkeit halber hier das vollständige Tabellenskript:

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)
Heinzi
quelle

Antworten:

6

Da in der Frage angegeben ist, dass SQL Server 2012 RTM (Build 2100) verwendet wird, ist dieser Fehler wahrscheinlich:

UPDATE: Das Sequenzobjekt generiert doppelte Sequenzwerte, wenn SQL Server 2012 oder SQL Server 2014 unter Speicherdruck stehen

was sagt:

Angenommen, Sie erstellen ein Sequenzobjekt, für das die CACHEOption in Microsoft SQL Server 2012 oder SQL Server 2014 aktiviert ist. Wenn die Instanz unter Speicherdruck steht und mehrere gleichzeitige Verbindungen Sequenzwerte von demselben Sequenzobjekt anfordern, werden möglicherweise doppelte Sequenzwerte generiert. Außerdem tritt ein Fehler bei der Verletzung eines eindeutigen oder Primärschlüssels (PK) auf, wenn der doppelte Sequenzwert in eine Tabelle eingefügt wird.

Beachten Sie, dass IDENTITYder Sequenzobjektmechanismus in SQL Server 2012 und höher verwendet wird.

Das Problem wurde zuerst behoben in:

  • Kumulatives Update 6 für SQL Server 2014
  • Kumulatives Update 4 für SQL Server 2012 SP2
Cine
quelle