[FIX] 自己結合を伴う更新によって間違った数の行が更新される

文書翻訳 文書翻訳
文書番号: 285870 - 対象製品
この記事は、以前は次の ID で公開されていました: JP285870
すべて展開する | すべて折りたたむ

目次

現象

次の条件が当てはまる場合、UPDATE 操作によって変更される行の数が正しくないことがあります。
  • クエリでテーブル TabA の列 ColA を更新する場合
  • このクエリで、別名 TabB を使用して TabA を再び参照する場合
  • クエリのどこかに TabB.ColA への参照が存在する場合
  • TabA の更新される列が、いずれもインデックス列ではない場合
  • ハッシュ結合またはマージ結合が使用されている場合

原因

クエリ プランの UPDATE 演算子の下に必要な Table Spool が含まれていない場合があります。この Table Spool は、Halloween Protection を提供するのに必要なものです。

解決方法

この問題を解決するために、SQL Server 2000 及び SQL Server 7.0 の最新の Service Pack の適用をお願いいたします。
最新の SQL Server サービスパックのダウンロードおよびインストールについて詳しくは以下をご覧下さい。

http://www.microsoft.com/japan/sql/download/default.asp (日本語版)
http://www.microsoft.com/sql/downloads/default.htm (英語版)

回避策

この問題を回避するには、次の手順を実行します。
  • OPTION(LOOP JOIN) を使用して、ループ結合を強制します。

    または

  • 更新された列にインデックスを追加します。

状況

弊社では、これを本資料の冒頭に記述した弊社製品の問題として確認しています。

SQL Server 2000

この問題は、Microsoft SQL Server version 2000 Service Pack 1 で修正されています。

SQL Server 7.0

この問題は、Microsoft SQL Server version 7.0 Service Pack 4 で修正されています 。

詳細

Halloween Protection は、UPDATE 操作によってテーブル内の行の物理的な位置が変更されるという状況を防ぐために必要です。このような状況の結果として、1 つの論理操作のコンテキスト内で同じ行が複数回アクセスされるという発生してはならない現象が起こる場合があります。この不具合の条件に当てはまる場合、SQL Server オプティマイザは、適切な Halloween Protection を持つプランを作成しないことがあります。

次のサンプル コードを実行すると、この問題が発生します。
set nocount on
create table test(id int, pid int, fn varchar(256), rn varchar(8))
go
declare @c int
set @c = 1
insert into test values(0, NULL, 'root', 'root')
while @c < 10
begin
   insert into test values(@c, @c-1, NULL, cast(@c as varchar(8)))
   set @c = @c + 1
end
create unique clustered index idx_c_id on test(id)
go
update test
set fn = parent.fn + '/' + test.rn
from test(index=0) , test parent(index=0)
where test.pid = parent.id and test.fn is NULL --  and parent.fn <> ''
option(hash join,force order)
更新後のテーブルの正しい内容は次のとおりです。

正しい結果 :
id          pid         rn       fn                                                                                                                                                                                                                                                               
----------- ----------- -------- ---- 
0           NULL        root     root
1           0           1        root/1
修正プログラムを適用する前の結果は、次のとおりです。

正しくない結果 :
id          pid         rn       fn                                                                                                                                                                                                                                                               
----------- ----------- -------- ----
0           NULL        root     root
1           0           1        root/1
2           1           2        root/1/2
3           2           3        root/1/2/3
4           3           4        root/1/2/3/4
5           4           5        root/1/2/3/4/5
6           5           6        root/1/2/3/4/5/6
7           6           7        root/1/2/3/4/5/6/7
8           7           8        root/1/2/3/4/5/6/7/8
9           8           9        root/1/2/3/4/5/6/7/8/9

関連情報

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

この資料に含まれているサンプル コード/プログラムは英語版を前提に書かれたものをありのままに記述しており、日本語環境での動作は確認されておりません。

プロパティ

文書番号: 285870 - 最終更新日: 2004年3月2日 - リビジョン: 2.1
この資料は以下の製品について記述したものです。
  • Microsoft SQL Server 7.0 Standard Edition
  • Microsoft SQL Server 2000 Standard Edition
キーワード:?
_ik kbbug kbfix kbsqlserv2000bug kbsqlserv700bug KB285870
"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