今まで開発にはSqlServer2005のSP2を利用していて、IDENTITYが設定されたテーブルのDELETEトリガにSEEDの再設定を行うものを仕込んでいたんだよね。こんな感じに。
DECLARE @MAXIDENT INT;
SELECT @MAXIDENT = MAX(SAMPLEUID) FROM SAMPLE_TABLE;
DBCC CHECKIDENT ('SAMPLE_TABLE', RESEED, @MAXIDENT);
今まではこれで問題なくSEEDの再設定が行えていたんだけど、今回SP3を適用して確認しているときに問題が発生。DBCCの部分でパラメータ不正的なエラーになっていたんだよね。少し詳しく見ていくと次のようなケースで発生していたみたいで。
- DBCCを行うテーブルにレコードが1行も存在しない時
この場合にはDBCC CHECKIDENTがエラーとなるように動きが変わったんだよなぁ。ただ正直言ってSP3で何が変更されたとか、もともとこの方法がまずいだとかまで調べないでやっていたものだから何とも断定できないけれども。でもSP2環境では問題なく動いていたのは事実。
今回は次のように対応することでSEEDの再設定が行えました。
DECLARE @MAXIDENT INT;
SELECT @MAXIDENT = MAX(SAMPLEUID) FROM SAMPLE_TABLE;
IF @MAXIDENT IS NULL
SET @MAXIDENT = 0;
DBCC CHECKIDENT ('SAMPLE_TABLE', RESEED, @MAXIDENT);
DBCCする前に、取得したIDENTITY値がNullかどうか判断してNullならば「0」をSEEDに設定すればOK。
COALESCE(MAX(SAMPLEUID), 0)
返信削除