現在オフラインです。再接続するためにインターネットの接続を待っています

[FIX] トランザクション内でのテーブル操作後の制約追加で一貫性エラー発生

この記事は、以前は次の ID で公開されていました: JP286749
この資料は、アーカイブされました。これは "現状のまま" で提供され、更新されることはありません。
現象
トランザクションを開き、テーブルを作成し、行を挿入し、テーブルにインデックスを作成し、トランザクションをコミットします。その後制約を追加すると、後続の DBCC CHECKTABLE が一貫性エラーを報告することがあります。DBCC CHECKTABLE は以下のような結果を返すことがあります。
サーバー : メッセージ 8970、レベル 16、状態 1、行 2
行エラー: オブジェクト ID 2041058307、インデックス ID 0、ページ ID (1:77)、行 ID 0。列 'LastModified' は NOT NULL で作成されましたが、行内は NULL です。
サーバー : メッセージ 8970、レベル 16、状態 1、行 2
行エラー : オブジェクト ID 2041058307、インデックス ID 0、ページ ID (1:77)、行 ID 1。列 'LastModified' は NOT NULL で作成されましたが、行内は NULL です。
サーバー : メッセージ 8970、レベル 16、状態 1、行 2
行エラー : オブジェクト ID 2041058307、インデックス ID 0、ページ ID (1:77)、行 ID 2。列 'LastModified' は NOT NULL で作成されましたが、行内は NULL です。
'#TableX_____________________________000000000011' に対する DBCC の結果。
オブジェクト '#TableX______________________________________________000000000011' の 1 ページの中に 0 行あります。
CHECKTABLE found 0 allocation errors and 3 consistency errors in table '#TableX________________________000000000011' (object ID 2041058307).
repair_allow_data_loss は DBCC CHECKTABLE (tempdb.dbo.#TableX________________________________________000000000011) が見つけたエラーの最小修復レベルです。

次のようなメッセージが SQL Server エラー ログに記録されます。
<DOMAIN>\<user> が実行したDBCC CHECKTABLE (tempdb.dbo.#TableX______________________________000000000011) は 3 個のエラーを検出し、0 個のエラーを修復しました。
解決方法
この問題を解決するために、SQL Server 2000 の最新の Service Pack の適用をお願いいたします。
最新の SQL Server サービスパックのダウンロードおよびインストールについて詳しくは以下をご覧下さい。

http://www.microsoft.com/japan/sql/download/default.asp (日本語版)
http://www.microsoft.com/sql/downloads/default.htm (英語版)
回避策
この問題を解決するには、次のいずれかの方法を実行します。
  • トランザクションをコミットしてからインデックスを作成します。
  • インデックスを作成してからトランザクションを閉じるまでの間に、テーブルに値を挿入します。
  • トランザクションをコミットしてから制約を追加するまでの間に、テーブルに値を挿入します。
状況
弊社では、これを Microsoft SQL Server version 2000 の問題として確認しています。
この問題は、Microsoft SQL Server version 2000 Service Pack 1 で修正されています。
詳細
この問題を再現するには、次のスクリプトを実行します。
begin trancreate table #TableX (Col1 varchar(20))insert #TableX values ('A')insert #TableX values ('B')insert #TableX values ('C')create index ix_Col1 on #TableX(Col1)  -- この行を commit の後に移動すると正しく動作します--insert #TableX values ('D') -- またはこの行のコメント記号を外すと正しく動作しますcommit--insert #TableX values ('D') -- またはこの行のコメント記号を外すと正しく動作しますalter table #TableX add LastModified datetime not null constraint cn_Enabled default getdate()goselect * from #TableXdbcc checktable(#TableX)godrop table #TableX
関連情報
この資料は米国 Microsoft Corporation から提供されている Knowledge Base の Article ID 286749 (最終更新日 2001-06-14) をもとに作成したものです。

プロパティ

文書番号:286749 - 最終更新日: 01/16/2015 21:30:05 - リビジョン: 2.1

Microsoft SQL Server 2000 Standard Edition

  • kbnosurvey kbarchive kbbug kbfix kbsqlserv2000bug kbsqlserv2000sp1fix KB286749
フィードバック