2009-06-12 16 views
4

私は奇妙な問題に遭遇しており、それを理解しようとするいくつかの助けが必要です。Sql Server 2005プライマリキー違反のID列

私はすべてのアプリケーションデータ列に加えて、ID列(nullではないint、Identity、1から始まり、1ずつ増加する)を持つデータベースを持っています。表の主キーはID列であり、他のコンポーネントはありません。

アプリケーションは同じデータの複数の提出を許可する必要があるため、「自然な主キー」として使用できるデータセットはありません。

QAは、彼らが、今朝のアプリケーションをテストしましたが、私は(直接デシベル所有者としてサーバにログイン以外の)テーブルに新しいレコードを追加する唯一の方法であるストアドプロシージャ、

を持っていますデータベースに新しいレコードを入力します(意図したとおりにアプリケーションを使用し、最後の2週間は実行しています)、このテーブルで主キー違反が発生しました。

これは私が約10年前に主キーをやっていたのと同じように、これを一度も実行したことはありません。

これを修正する方法についてのご意見はありますか?それとも、長い間に一度現れる宇宙線の不具合の1つです。

アドバイスをいただきありがとうございます。

ナイジェルより多くの情報をスキーマの簡易版を

を与えるために、13:15 EDT 6月12日に編集

...

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などは使用しません。IDENTITY、@ scope_identityなどは使用しません。単なるファイルであり、忘れてしまいます。

私は、アイデンティティ値がリセットされておらず、ほかに誰も値を入力するために直接データベースアクセスを使用していないと確信しています。このプロジェクトでアイデンティティ挿入が使用される唯一の時間は、ルックアップテーブルに特定の値を設定するための初期データベース展開です。

QAチームは、エラーが発生した直後に再試行し、クエリを正常に提出できました。それ以来、これを再生しようとしていて、これまで成功していませんでした。

私は本当にアイデアをいただきありがとうございます。経験

に基づいて

+0

Hmmm ...万一、サニタイズされた表スキーマおよび/または問題の挿入文を貼り付けることができますか? – ristonj

+0

まだ新しいレコードを追加できませんか、それとも1回だけ発生しましたか? –

+0

ナイジェルの下で私の答えをチェックしてください... – Eric

答えて

1

ランダムな思考あなたはレッドゲートデータが比較、たとえば、とのデータを同期化しています。これには、ID列を再配置するオプションがあります。それは使用上の問題を引き起こしています。先月の別のプロジェクト。

また、明示的にIDをロード/同期している場合もあります。

+0

これは約2週間前にQA専用のデータベース設定で起こったものです。 データベースはVSTS Team Suite、2008年版から配備され、生成されたレコードは500件ありました。それ以来、問題報告の前後に約50件のレコードが追加されています。 – Nigel

+0

誰かがDBCC CHECKIDENTまたはSET IDENTITY_INSERTを実行しました。 – gbn

4

私は潜在的な原因については説明しませんが、ID列のシード値を変更することは可能です。シードがテーブルに次の値が既に存在する場所に下げられた場合、それは確かにあなたが見ているものを引き起こす可能性があります。 DBCC CHECKIDENT (table_name)を実行して何が得られたかを見てください。

詳細については、アイデンティティの種子が破損しているか、何らかの形でリセットしてしまったようthis page

+0

はい、それは私の最初の腸反応でした。おそらくテーブルが周りを回っていて、IDENTITY値がリセットされています。 –

+1

誰かがSET IDENTITY_INSERT ONをオンにしてテーブルに値を挿入しました。 –

+0

アダムさん、ありがとう、私はその命令を知らなかったが、それは助けにはならなかった。 現在の値は550、カラムの最大値は550と報告されています。 – Nigel

6

はサウンドチェックしてください。最も簡単な解決策は、ID列の現在の最大値にシードをリセットするには次のようになります。

DECLARE @nextid INT; 
SET @nextid = (SELECT MAX([columnname]) FROM [tablename]); 
DBCC CHECKIDENT ([tablename], RESEED, @nextid); 
+1

あなたはそれを自分で実行しようとしましたか?いつまで? – gbn

+1

私は私の声明をテストしなかったので、私はそれを書き換えた –

+0

私はこれを2番目にします。シードがロールバックされていない限り、値を複製する方法はありません。私は腐敗が起こったと思うが、私はSQLを10年間使っていて、低いディスクスペースのシナリオでは1度しか破損が見られていない –

0

たぶん誰かが直接明示的に新しいIDを使用してサーバーにログインするいくつかのレコードを挿入し、その後、身元の自動インクリメントフィールドが到達したとき、このプライマリキー違反が発生しました。

しかし、宇宙線が良い説明ALGOです;)

0

ただ非常に、非常に確認するために...あなたはあなたのストアドプロシージャでIDENTITY_INSERTを使用していないが、あなたは?このようなロジック:

declare @id int; 
Set @id=Select Max(IDColumn) From Sometable; 
SET IDENTITY_INSERT dbo.SomeTable ON 
Insert (IDColumn, ...others...) Values (@id+1, ...others...); 
SET IDENTITY_INSERT dbo.SomeTable OFF 
. 
. 
. 

ちょうどそれを入力すると感じます。しかし、はしばらくお待ちしております。あなたはアイデンティティの列が何であるかを全く理解していない人々にぶつかり、これが排除されていることを確認したいと思います。ところで、これが答えであれば、質問を削除してこれがあなたの問題であることを認めないと、私はそれをあなたに押しつけません!

私は毎年夏にインターンを雇うと言うことができますか?

+0

ええ、私はチェックして、IDENTITY_INSERTはストアドprocsにありません。 私が見つけた唯一の場所は、検索データ(問題のテーブルとは異なるテーブル)を読み込むために実行される最初のクエリでした。 – Nigel

0

@@ identityやscope_identity()のような関数をあなたの手続きで使用していますか?あなたのテーブルには、トリガーまたは複数の挿入を持っている場合は、うまくいけば、それはそうではありませんあなたは

+0

これは、データの破損につながりますが、明示的なID値を挿入していない限り、ID列を持つ表の主キー違反にはなりません。 –

0

プライマリキー違反は必ずしもそのテーブルからのものではありません。

アプリケーションは、他のテーブルに接触するか、その関数の他のストアドプロシージャを呼び出しますか?テーブルにトリガーがありますか?または、ストアドプロシージャ自体が他のテーブルやストアドプロシージャを使用していますか?

特に、監査テーブルまたはトリガーがこれを引き起こす可能性があります。

+0

サーバーから取得したエラーメッセージは、このテーブルがエラーをスローしていることを指定しました。 ストアドプロシージャは、他のテーブルに触れたり、別のストアドプロシージャを呼び出したりしません。 更新トリガーがありますが、最初に行うのは、実際に更新であるかどうかを確認することです(削除された擬似表は空ではありません)。 私はこれを宇宙線までチョークするつもりだと思っています(私のマネージャーは、再現できないので、それが戻ってこない限り無視することができます)。 – Nigel