Bug #: 50003167 (SQL 修正プログラム)
SQL がリリースされた後にリリースされたビルドのマスターリストの詳細については、次の記事の番号をクリックして、Microsoft サポート技術情報の記事を参照してください。
957826 Sql server 2008 以降にリリースされた SQL Server 2008 ビルドと、sql server 2005 Service Pack 2 以降にリリースされた SQL Server 2005 ビルドの詳細については、こちらを参照してください。
現象
Microsoft SQL Server 2008 では、次の条件に該当する場合、外部キー制約が適用されないことがあります。
-
MERGE ステートメントが発行されます。
-
更新のターゲット列に、非クラスター化一意インデックスがあります。
次のような状況を想定します。 このステートメントでは、 Table1という名前のテーブルのColumn1という名前の一意の列が更新されます。 Table1 は、 Table2という名前のテーブルから外部キー制約によって参照されます。結果として、 テーブル 1 の行は、存在していない場合に変更されます。 さらに、 Table2 には Table1への未解決の参照が含まれる行も含まれます。 この問題は、次の条件が満たされている場合に発生します。
-
Table1で参照されているColumn1列は、 table1のクラスタリングキーの一部ではありません。
-
Column1列に割り当てることができるのは、可能な値を1つだけです。 たとえば、次のシナリオのいずれかが発生します。
-
マージソースは1行のデータです。 たとえば、マージソースは、次のいずれかの select ステートメントのいずれかになります。
-
select <ConstantValues>
-
select <Parameters>
注: このシナリオは、最も可能性が高いシナリオです。
-
-
マージソースは、実際には1行のデータです。 たとえば、マージソースは、次のいずれかの select ステートメントのいずれかになります。
-
select <ColumnName> from <TableName> where <TableName>.<ColumnName> = 1
注<TableName>。<ColumnName> は、クエリオプティマイザーによって識別され、一意の値になります。
-
select top 1 <ColumnName> from <TableName>
-
-
マージソースとマージターゲットの間の結合には、1つの行が更新されることを保証する述語が含まれています。
-
Update 句は、マージソースに関係なく、 Column1 列を定数値に設定します。
-
-
Table2の外部キー制約で、 [更新時] 連鎖オプションが有効になっていません。
注: MERGE ステートメントを使って、外部キー制約によって参照される非クラスター化一意インデックスを持つ列を更新する場合は、この修正プログラムを適用することをお勧めします。
解決方法
この問題の修正プログラムは、累積的な更新プログラム1で最初にリリースされました。 SQL Server 2008 用の累積更新プログラムパッケージの入手方法の詳細については、次の記事番号をクリックして、Microsoft サポート技術情報の記事を参照してください。
956717 SQL Server 2008 の累積的な更新プログラムパッケージ1注 ビルドは累積的であるため、それぞれの新しい修正プログラムには、以前の SQL Server 2008 fix release に含まれていたすべての修正プログラムとセキュリティ修正プログラムが含まれています。この修正プログラムを含む最新の修正プログラムを適用することを検討することをお勧めします。 詳細については、以下の記事の番号をクリックして、Microsoft サポート技術情報の記事を参照してください。
956909 SQL Server 2008 がリリースされた後にリリースされた SQL Server 2008 ビルド
回避策
修正プログラムパッケージを行うと、問題が解決されます。 「Symptoms」セクションで説明されているシナリオで MERGE ステートメントを使用していて、修正プログラムを適用しないことを選んだ場合は、次の手順に従ってこの問題を解決してください。
-
マージソースの値が、クエリでインラインではなく、テーブル、一時テーブル、またはテーブル変数に含まれるように、マージステートメントを書き直します。
-
トレースフラグ8790を使用します。 このトレースフラグは、オプティマイザーがワイド更新プランと呼ばれる種類のプランを使用することを強制します。 Wide 更新プランに問題はありません。 この手順では、すべての DML ステートメントのパフォーマンスのリスクを伴います。 そのため、アプリケーションを変更できない場合を除き、この手順を使用しないようにしてください。
次の Transact-sql スクリプトは、この修正プログラムを適用できない場合に、この問題を解決するためにスクリプトを変更する方法を示しています。たとえば、次のようなスクリプトがあるとします。
use tempdb;drop table sale, product;create table product(pno int not null primary key, name char(30), pAlternateKey char(6) not null unique);create table sale(sno int not null primary key, pAlternateKey char(6) not null references product(pAlternateKey));insert product values(1, 'Office Chair', 'ochair');insert sale values(1, 'ochair')-- No violation of foreign key constraint is detected. However, one should be.merge into productusing (select 'Office Chair2' as name, 1 as pno, 'oxx' as pAlternateKey) as srcon product.pno = src.pnowhen matched then update set product.pAlternateKey = src.pAlternateKey, product.name = src.namewhen not matched then insert values(src.pno, src.name, src.pAlternateKey);
次のようにスクリプトを変更します。
insert product values(1, 'Office Chair', 'ochair');insert sale values(1, 'ochair')-- A foreign key constraint violation is detected, and the update fails.declare @source table (name nchar(30), pno int, pAlternateKey nchar(30));insert into @source values('Office Chair2',1,'oxx');merge into productusing @source as srcon product.pno = src.pnowhen matched then update set product.pAlternateKey = src.pAlternateKey, product.name = src.namewhen not matched then insert values(src.pno, src.name, src.pAlternateKey);
状態
マイクロソフトでは、この問題をこの資料の対象製品として記載されているマイクロソフト製品の問題として認識しています。
詳細情報
変更されるファイルの詳細について、およびこの Microsoft サポート技術情報の記事で説明されている修正プログラムを含む累積的な更新プログラムパッケージを適用するための前提条件については、次の記事番号をクリックして、Microsoft サポート技術情報の記事を参照してください。
956717 SQL Server 2008 の累積的な更新プログラムパッケージ1
関連情報
SQL Server 2008 のリリース後に使用できるビルドの一覧の詳細については、次の記事の番号をクリックして、Microsoft サポート技術情報の記事を参照してください。
956909 SQL Server 2008 がリリースされた後にリリースされた SQL Server 2008 ビルドSQL Server の段階的サービスモデルの詳細については、次の記事番号をクリックして、Microsoft サポート技術情報の記事を参照してください。
935897 SQL Server チームが段階的なサービスモデルを利用して、報告された問題の修正プログラムを提供するSQL Server 更新プログラムの名前付けスキーマの詳細については、次の記事番号をクリックして、Microsoft サポート技術情報の記事を参照してください。
822499Microsoft SQL Server ソフトウェア更新プログラムパッケージの新しい名前付けスキーマソフトウェア更新プログラムの用語の詳細については、次の記事番号をクリックして、Microsoft サポート技術情報の記事を参照してください。
824684 マイクロソフトのソフトウェアの更新で使用される一般的な用語の説明
関連情報
SQL Server 2008 の非クラスター化インデックスの詳細については、次の Microsoft Developer Network (MSDN) Web サイトを参照してください。
http://msdn.microsoft.com/en-us/library/ms179325(SQL.100).aspx