2009-07-20 6 views
0

私は主キーとしてID列を持つテーブルを持っています。ID列が同期外になった

数日前までは、このテーブルを使用しているアプリケーションはPK違反について不平を言っています。最初は私がDBCC CHECKIDENTを覚えているまで、これは不可能だと思った。マジック関数は、「現在の列の値」が「現在の識別の値」よりも高いことを教えてくれました。私は最高の価値を追求し、すべてが再びよく見えました。

私の質問は、今後この問題が発生するのを防ぐため、同期外れの問題の原因は何でしょうか?それを防ぐ方法は?

答えて

3

IDENTITY_INSERTがオンになっているインスタンスを見つけるためにコードを検索しなければならないように聞こえ、次に(おそらく高い番号のident列)キーが挿入されているようです。挿入された(そして任意の)PK値がシード値内にあるという点で、あなたのアプリケーションはおそらく過去に運が良かったでしょう。

+0

ストアドプロシージャを使用して、挿入ポイントが1つしかありません。しかし、それはIDENTITY_INSERTを使用してSSMSを介して値を変更したり、ログインしている人を守ることはできません。 +1、ありがとう! –

+0

しかし、..しかし、開発者はこれまでどんなことをやろうとしませんでしたか?それはそうだと言ってください! :) デプロイメントの一部として実行される移行ETLスクリプトがある場合は、明示的にident値が必要な場合もあるため、これらのスクリプトを確認してください。 –

+0

明示的ではありません。 IDENTITY_INSERTを有効にする機能を無効にするにはどうすればよいですか?何か案が? –

0

予定のメンテナンスをしていて、ピーク時にシングルユーザーモードになっている場合を除いて、運用環境でIDインサートを有効にするべきではありません。これは、レコードを挿入しようとする人に影響を与えます(通常の挿入プロセスは、IDを指定していないためエラーです)。プロダクト環境でこれを使用している開発者やプロセスがある場合は、すぐにプロセスを再考する必要があります。

開発者は生産権を持ってはならず、dbaが影響を与えることを考えずに特定の挿入をオンにすることができないため、そのステップだけで問題が再発するのを防ぐことができます。私はジョシュに同意し、実行されているETLインポートをチェックします。特に、問題が発生した時点で実行されたものを探します。

ID値を変更したりアイデンティティを挿入したりする開発者がいる場合は、これが非常に悪い習慣である理由を教えてください。 ID値は、一度挿入すると変更しないでください。これは、関連するすべてのテーブルにも影響します。

+0

誰かが何かを定期的に挿入したとは言わなかったが、それは可能性がある。 IDENTITY_INSERT以外、問題の原因は他にありますか? –

関連する問題