2012-03-02 11 views
4

SQL Server 2008 R2を使用して、手動エントリシステムのユーザーの上位99 ID値を予約するユーザーテーブルがあります。私は自分のアイデンティティシードを100に設定しているので、すべての新規ユーザーには通常の動作で100+の値が与えられます。私はSET IDENTITY_INSERTを使用してIDの指定を抑制し、この列に明示的な値を提供できることを発見しました。私が知る必要があり、MSDNから実際に理解できなかったのは、この抑制がだけが実行中のスクリプトのコンテキストに適用されるかどうかです。 (すなわち、通常の挿入PROCを呼び出すサイト上で作成された新しいユーザーは、まだ次の値> 100の自動生成されたIDが与えられます)SQLサーバーID抑制コンテキスト

+0

私は、テーブルを作成し、最初の99行をロードし、それらを予約済みおよび未使用としてマークする傾向があります。割り当てられていない行を追跡するために必要なのは、NULLユーザー名だけです。 OTOH、私は一般にデザインに熱心ではない。私のシステムのほとんどは、他の履歴データが意味をなされるように、つまり他のレコードを作成した人や何らかのアクションを許可したユーザーデータを永続的に保持します。ユーザーが消えると、そのアカウントには非アクティブとしてフラグが設定されます。この場合、平均的なユーザー数が常に99を超えないように制限されます。むしろ限られたリソースを割り当てたいと思います。短縮ダイヤル番号をユーザーに送信します。 – HABO

答えて

6

SET IDENTITY_INSERTはそれがは必要ありません、あなたが直接、ID値を挿入することがことができますです。したがって、たとえそれが共有設定であったとしても、あなたの "通常の" INSERTを実行すると、自動生成されたIDが得られます。

つまり、それはセッション単位の設定でもあるので、二重に安全です。

デザインに関して - 私は似たようなことをしており、問題は見られません。 「よく知られている」識別子を持つことはかなり一般的ですが、100が適切なブロックであるかどうかを判断する必要があります。可能であれば、後で非連続ブロックを開く必要はありません。私は過去に負の数を使用しましたが、予約された範囲はありませんでした。

+3

さらに、一度に1つのセッション内の1つのテーブルのみがIDENTITY_INSERTを持つことができます。http://msdn.microsoft.com/en-us/library/ms188059.aspx –

関連する問題