web-dev-qa-db-ja.com

IDENTITY列の突然のPRIMARY KEY違反

log ID列を持つIDテーブルがあります。すべてが何年もうまく機能します。次に、昨日、ログに次のエラーが表示されます。

ステートメントは終了されました。
PRIMARY KEY制約「PK__log__ID__3B40CD36」の違反。オブジェクト 'dbo.log'に重複するキーを挿入することはできません。重複するキーの値は(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'、 'C​​ustomer'、 '' 、 ''、 'WShop-Trans'、0、 '1DatensätzefürTabelle adresse gesendet。'、 ''、 '')

IDENTITYシードを確認しましたが、問題ありません。

クエリ:DBCC CHECKIDENT(log)

結果:ID情報を確認しています:現在のID値 '296021'、現在の列値 '296021'。
DBCCの実行が完了しました。 DBCCがエラーメッセージを出力した場合は、システム管理者に連絡してください。

クエリ:ログからSELECT MAX(ID)

結果:296021

テーブルにはトリガーがなく、シード値をいじる人はいません(私がデータベースサーバーを管理しているので、私はそれについてかなり確信しています)。

これまでのところ、これは1回限りのイベントであり、再現することはできません。

SQL Serverの不具合のように見えますが、興味があります。これは既知のバグですか、それとも他にもっともらしい説明はありますか? SQL ServerのバージョンはMicrosoft SQL Server 2012 - 11.0.2100.60 (X64)です。

完全を期すために、完全なテーブルスクリプトを次に示します。

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

質問はSQL Server 2012 RTM(build 2100)が使用されていることを示しているため、おそらくこのバグです。

FIX:SQL Server 2012またはSQL Server 2014がメモリ不足の場合、シーケンスオブジェクトが重複したシーケンス値を生成する

それは言う:

Microsoft SQL Server 2012またはSQL Server 2014でCACHEオプションが有効になっているシーケンスオブジェクトを作成するとします。インスタンスがメモリ不足の状態で、複数の同時接続が同じシーケンスオブジェクトからシーケンス値を要求すると、複製されます。シーケンス値が生成される場合があります。また、重複するシーケンス値がテーブルに挿入されると、一意または主キー(PK)違反エラーが発生します。

IDENTITYは、SQL Server 2012以降のシーケンスオブジェクトメカニズムを使用することに注意してください。

この問題は最初に修正されました:

  • SQL Server 2014の累積的な更新6
  • SQL Server 2012 SP2用の累積的な更新4
6
Cine