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

文書翻訳 文書翻訳
文書番号: 286749 - 対象製品
この記事は、以前は次の 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 tran
create 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()
go
select * from #TableX
dbcc checktable(#TableX)
go
drop table #TableX

関連情報

この資料は米国 Microsoft Corporation から提供されている Knowledge Base の Article ID 286749 (最終更新日 2001-06-14) をもとに作成したものです。

プロパティ

文書番号: 286749 - 最終更新日: 2003年11月12日 - リビジョン: 2.1
この資料は以下の製品について記述したものです。
  • Microsoft SQL Server 2000 Standard Edition
キーワード:?
kbbug kbfix kbsqlserv2000bug kbsqlserv2000sp1fix KB286749
"Microsoft Knowledge Baseに含まれている情報は、いかなる保証もない現状ベースで提供されるものです。Microsoft Corporation及びその関連会社は、市場性および特定の目的への適合性を含めて、明示的にも黙示的にも、一切の保証をいたしません。さらに、Microsoft Corporation及びその関連会社は、本文書に含まれている情報の使用及び使用結果につき、正確性、真実性等、いかなる表明・保証も行ないません。Microsoft Corporation、その関連会社及びこれらの権限ある代理人による口頭または書面による一切の情報提供またはアドバイスは、保証を意味するものではなく、かつ上記免責条項の範囲を狭めるものではありません。Microsoft Corporation、その関連会社 及びこれらの者の供給者は、直接的、間接的、偶発的、結果的損害、逸失利益、懲罰的損害、または特別損害を含む全ての損害に対して、状況のいかんを問わず一切責任を負いません。(Microsoft Corporation、その関連会社 またはこれらの者の供給者がかかる損害の発生可能性を了知している場合を含みます。) 結果的損害または偶発的損害に対する責任の免除または制限を認めていない地域においては、上記制限が適用されない場合があります。なお、本文書においては、文書の体裁上の都合により製品名の表記において商標登録表示、その他の商標表示を省略している場合がありますので、予めご了解ください。"

フィードバック

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com