[FIX] SELECT * FROM SYSINDEXESを実行するとAVが発生

この記事は、以前は次の ID で公開されていました: JP295114
この資料は、アーカイブされました。これは "現状のまま" で提供され、更新されることはありません。
現象
Microsoft SQL Server 7.0 からアップグレードしたデータベースに SELECT * FROM SYSINDEXES を実行すると、アクセス違反が発生することがあります。アクセス違反が発生すると、次のようなエラー メッセージがクエリ ウィンドウに表示されます。
ODBC: メッセージ 0、レベル 19、状態 1
SqlDumpExceptionHandler: プロセス 51 で重大な例外 c0000005 EXCEPTION_ACCESS_VIOLATION が発生しました。SQL Server はこのプロセスを終了しています。

サーバー : メッセージ 1203、レベル 20、状態 1、行 1
プロセス ID 51 が所有していないリソース KEY: 7:2:1 (790023da5d09) のロックを解除しようとしています。
原因
SQL Server 2000 の sysindexes システム テーブルでは、keys 列の最大長は 1088 に定義されています。一方、SQL Server 7.0 では 816 です。データベースを SQL Server 7.0 からアップグレードしたときに、keys 列の最大長が更新されていません。そのため、816 バイトを超える keys 列を持つインデックスが作成されて、そのインデックスが SELECT * FROM SYSINDEXES でフェッチされた場合、既に割り当てられている 816 バイトを超えてプリフェッチ バッファが書き込まれるので、これが原因となってアクセス違反が発生します。
解決方法
この問題を解決するために、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 で修正されています。
詳細

問題の再現手順

  1. SQL Server 7.0 データベースを SQL Server 2000 にアタッチするか復元します。
  2. 次の SQL ステートメントを実行して、テーブルおよびインデックスを作成します。このインデックスの keys 列は 816 バイトを超えます。
    use <dbname>goif object_id('t1') is not null drop table t1gocreate table t1 (c1 int, c2 int, c3 int, c4 int,  c5 int, c6 int, c7 int, c8 int, c9 int, c10 int, c11 int, c12 int, c13 int, c14 int, c15 int, c16 int, c17 int, d1 int, d2 int, d3 int, d4 int,  d5 int, d6 int, d7 int, d8 int, d9 int, d10 int, d11 int, d12 int, d13 int, d14 int, d15 int, d16 int, d17 int )gocreate clustered index i_t1 on t1 (c1, c2, c3, c4, c5, c6,c7, c8, c9, c10, c11, c12, c13, c14, c15, c16)create nonclustered index i_t2 on t1 (d1, d2, d3, d4, d5, d6,d7, d8, d9, d10, d11, d12, d13, d14, d15, d16)go


  3. 次のクエリを実行すると、アクセス違反が発生します。
    SELECT * FROM SYSINDEXES
また、SQL Server エラー ログには、次のスタック ダンプおよびエラーが表示されます。
2001-04-02 17:55:04.09 spid51    Using 'sqlimage.dll' version '4.0.5'Stack Dump being sent to d:\mssql8\MSSQL\log\SQL00011.dmp2001-04-02 17:55:04.09 spid51    Error: 0, Severity: 19, State: 02001-04-02 17:55:04.09 spid51    SqlDumpExceptionHandler: Process 51 generated fatal exception c0000005 EXCEPTION_ACCESS_VIOLATION. SQL Server is terminating this process..********************************************************************************* BEGIN STACK DUMP:*   04/02/01 17:55:04 spid 51**   Exception Address = 004270D7 (CStmtQuery::ErsqExecuteQuery(class CMsqlExecContext *,class CEsComp const *,class CEsComp const *,unsigned long *,int,int)const  + 0000044A Line 0+00000000)*   Exception Code    = c0000005 EXCEPTION_ACCESS_VIOLATION*   Access Violation occurred reading address 00000038* Input Buffer 52 bytes -*  select * from sysindexes  *  *******************************************************************************Short Stack Dump004270D7 Module(sqlservr+000270D7) (CStmtQuery::ErsqExecuteQuery(class CMsqlExecContext *,class CEsComp const *,class CEsComp const *,unsigned long *,int,int)const +0000044A)00441A34 Module(sqlservr+00041A34) (CStmtSelect::XretExecute(class CMsqlExecContext *)const +0000021C)004160DB Module(sqlservr+000160DB) (CMsqlExecContext::ExecuteStmts(class ExecutionContext *)+0000027E)00415765 Module(sqlservr+00015765) (CMsqlExecContext::Execute(class CCompPlan *,class CParamExchange *)+000001C7)00415410 Module(sqlservr+00015410) (CSQLSource::Execute(class CParamExchange *)+00000343)005A683F Module(sqlservr+001A683F) (CStmtPrepQuery::XretExecute(class CMsqlExecContext *)const +00000211)004160DB Module(sqlservr+000160DB) (CMsqlExecContext::ExecuteStmts(class ExecutionContext *)+0000027E)00415765 Module(sqlservr+00015765) (CMsqlExecContext::Execute(class CCompPlan *,class CParamExchange *)+000001C7)00415410 Module(sqlservr+00015410) (CSQLSource::Execute(class CParamExchange *)+00000343)00459A54 Module(sqlservr+00059A54) (language_exec(struct srv_proc *)+000003C8)004175D8 Module(sqlservr+000175D8) (process_commands(struct srv_proc *)+000000E0)410735D0 Module(UMS+000035D0) (ProcessWorkRequests(class UmsWorkQueue *)+00000264)4107382C Module(UMS+0000382C) (ThreadStartRoutine(void *)+000000BC)7800BEA1 Module(MSVCRT+0000BEA1) (_beginthread+000000CE)77E92CA8 Module(KERNEL32+00012CA8) (CreateFileA+0000011B)-------------------------------------------------------------------------------2001-04-02 17:55:04.49 spid51    clean_tables_xact: active sdes for tabid 22001-04-02 17:55:04.49 spid51    Process 51 unlocking unowned resource: KEY: 7:2:1 (790023da5d09)2001-04-02 17:55:04.49 spid51    Error: 1203, Severity: 20, State: 12001-04-02 17:55:04.49 spid51    Process ID 51 attempting to unlock unowned resource KEY: 7:2:1 (790023da5d09)..2001-04-02 17:55:04.50 spid51    clean_tables_xact: active sdes for tabid 22001-04-02 17:55:04.50 spid51    Process 51 unlocking unowned resource: KEY: 7:2:1 (790023da5d09)2001-04-02 17:55:04.50 spid51    Error: 1203, Severity: 20, State: 12001-04-02 17:55:04.50 spid51    Process ID 51 attempting to unlock unowned resource KEY: 7:2:1 (790023da5d09)..2001-04-02 17:55:04.50 spid51    Error: 0, Severity: 19, State: 02001-04-02 17:55:04.50 spid51    language_exec: Process 51 generated an access violation. SQL Server is terminating this process..2001-04-02 17:55:04.50 spid51    clean_tables_xact: active sdes for tabid 22001-04-02 17:55:04.50 spid51    Process 51 unlocking unowned resource: KEY: 7:2:1 (790023da5d09)2001-04-02 17:55:04.50 spid51    Error: 1203, Severity: 20, State: 12001-04-02 17:55:04.50 spid51    Process ID 51 attempting to unlock unowned resource KEY: 7:2:1 (790023da5d09)..
関連情報
この資料は米国 Microsoft Corporation から提供されている Knowledge Base の Article ID 295114 (最終更新日 2001-06-15) をもとに作成したものです。

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

プロパティ

文書番号:295114 - 最終更新日: 01/16/2015 22:20:01 - リビジョン: 2.1

  • Microsoft SQL Server 2000 Standard Edition
  • kbnosurvey kbarchive _ik kbbug kbfix kbsqlserv2000bug kbsqlserv2000sp1fix KB295114
フィードバック