FIX: A MERGE 陳述式可能不外部索引鍵條件約束時強制陳述式會更新不是叢集的索引鍵的一部份一個唯一索引鍵資料行而且沒有單一資料列做為更新來源 SQL Server 2008 中

文章翻譯 文章翻譯
文章編號: 956718 - 檢視此文章適用的產品。
Bug #: 50003167 (SQL Hotfix)
如更多有關主清單的 SQL 發行之後所發行的組建,按一下下面的文件編號,檢視 「 Microsoft 知識庫 」 中的發行項:
957826您可以在其中找到 SQL Server 2008 的相關資訊會建置在 SQL Server 2008 之後所發行和 SQL Server 2005 組建在 SQL Server 2005 Service Pack 2 之後所發行
全部展開 | 全部摺疊

徵狀

在 Microsoft SQL Server 2008 中外部索引鍵條件約束可能會不會強制執行下列情況成立時:
  • 在發出 MERGE 陳述式。
  • 更新的目標資料行具有非叢集的唯一索引。
考慮下列案例。 陳述式更新名為名為 Table1 的資料表的 Column1 的唯一資料行。從名為 Table2 資料表的外部索引鍵條件約束參考 Table1

結果是當他們不應該已被變更 Table1 中的資料列。此外,Table2 也必須有 Table1 懸吊參考的資料列。

當下列情況成立時,此案例就會發生這個問題:
  • Table1 中參考的 Column1 資料行不是 Table1 的叢集的索引鍵 Table1 的一部分。
  • 只能有一個可能的值可以指派到 Column1 資料行。 比方說下列案例發生其中一:
    • 合併來源資料的單一資料列中取得。 比方說合併來源是從下列選取陳述式的其中一個:
      • select <ConstantValues>
      • select <Parameters>
      附註這種情況下是最可能的案例。
    • 合併來源是實際單一的資料列。 比方說合併來源是從下列選取陳述式的其中一個:
      • select <ColumnName> from <TableName> where <TableName>.<ColumnName> = 1
        附註<TableName><ColumnName> 由查詢最佳化器已知為唯一的值。
      • select top 1 <ColumnName> from <TableName>
    • 合併來源與合併目標之間聯結有保證的單一資料列將會更新的述詞。
    • 在更新子句將 Column1 資料行設定為不論合併來源的和常數值。
  • 外部索引鍵條件約束中 Table2 上未啟用 更新重疊顯示] 選項。
附註我們建議您套用此 Hotfix,如果您使用 MERGE 陳述式來更新具有外部索引鍵條件約束所參考的非叢集唯一索引的資料行。

解決方案

這個問題的修正程式先於累計更新 1 發行。如需有關如何取得此累積更新套件的 SQL Server 2008 的詳細資訊,按一下 [下列面的文件編號,檢視 「 Microsoft 知識庫 」 中的發行項]:
956717SQL Server 2008 的累積更新套件 1
附註因為組建是累計,每個新的修正程式版本包含所有 Hotfix 及先前的 SQL Server 2008 隨附所有安全性修正程式都修正版本。我們建議您考慮安裝最新的修正程式發行版本包含此 Hotfix。如需詳細資訊,請按一下下列的文件編號,檢視 「 Microsoft 知識庫 」 中的文件:
956909SQL Server 2008 建置發行 SQL Server 2008 之後所發行

其他可行方案

Hotfix 套件可排除問題。如果您使用 MERGE 陳述式在 < 徵狀 > 一節所述的案例,而且如果您選擇不套用 Hotfix,請依照下列步驟執行來消除這個問題:
  1. 使合併列印來源的值資料表、 暫存資料表或資料表變數代替正在中-對齊在查詢中,請重寫 MERGE 陳述式。
  2. 使用追蹤旗標 8790。此追蹤旗標會強制最佳化器使用一種稱為寬的更新計劃的計劃。大幅更新計劃並沒有問題。這個步驟商具有所有 DML 陳述式的效能風險。因此,您應該避免使用這個步驟中,除非它是不可能變更應用程式。
下列的 Transact-SQL 指令碼顯示變更您的指令碼如果要解決這個問題,如果您無法套用此 Hotfix 的一種方法。

您具有類似下列的指令碼的例如:
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 product
using (select 'Office Chair2' as name, 1 as pno, 'oxx' as pAlternateKey) as src
on product.pno = src.pno
when matched then
   update set product.pAlternateKey = src.pAlternateKey, 
              product.name = src.name
when 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 product
using @source as src
on product.pno = src.pno
when matched then
   update set product.pAlternateKey = src.pAlternateKey, 
              product.name = src.name
when not matched then
   insert values(src.pno, src.name, src.pAlternateKey);

狀況說明

Microsoft 已確認<適用於>一節所列之 Microsoft 產品確實有此問題。

其他相關資訊

如需有關哪些檔案會變更,及資訊有關任何先決條件套用累積更新套件,包含此 「 Microsoft 知識庫 」 文件中所述的 Hotfix,按一下下面的文件編號,檢視 「 Microsoft 知識庫 」 中的發行項:
956717SQL Server 2008 的累積更新套件 1

?考

如更多有關清單的組建,都可以使用 SQL Server 2008 發行後,按一下下面的文件編號,檢視 「 Microsoft 知識庫 」 中的發行項:
956909SQL Server 2008 建置發行 SQL Server 2008 之後所發行


如更多有關累加式的維修模型為 SQL Server,按一下下面的文件編號,檢視 「 Microsoft 知識庫 」 中的發行項:
935897累加式的維修模型是可以從 SQL Server 小組來傳遞回報問題的 Hotfix


如 SQL Server 更新命名的結構描述的更多有關,按一下 [下面的文件編號,檢視 「 Microsoft 知識庫 」 中的發行項]:
822499Microsoft SQL Server 軟體更新套件的新命名結構描述


如需有關軟體更新術語的詳細資訊,按一下 [下面的文件編號,檢視 「 Microsoft 知識庫 」 中的發行項]:
824684用來描述 Microsoft 軟體更新標準術語的說明

?考

如需有關 SQL Server 2008 中的非叢集索引的詳細資訊,請造訪下列 Microsoft 開發 o 人 h 員 ? 工 u 具 ? 網路 (MSDN) 網站]:
http://msdn.microsoft.com/en-us/library/ms179325(SQL.100).aspx

屬性

文章編號: 956718 - 上次校閱: 2008年9月19日 - 版次: 4.0
這篇文章中的資訊適用於:
  • Microsoft SQL Server 2008 Enterprise
  • Microsoft SQL Server 2008 Developer
  • Microsoft SQL Server 2008 Standard
  • Microsoft SQL Server 2008 Standard Edition for Small Business
  • Microsoft SQL Server 2008 Web
  • Microsoft SQL Server 2008 Workgroup
  • Microsoft SQL Server 2008 Express
  • Microsoft SQL Server 2008 Express with Advanced Services
關鍵字:?
kbmt kbautohotfix kbhotfixserver kbqfe kbpubtypekc kbfix KB956718 KbMtzh
機器翻譯
重要:本文是以 Microsoft 機器翻譯軟體翻譯而成,而非使用人工翻譯而成。Microsoft 同時提供使用者人工翻譯及機器翻譯兩個版本的文章,讓使用者可以依其使用語言使用知識庫中的所有文章。但是,機器翻譯的文章可能不盡完美。這些文章中也可能出現拼字、語意或文法上的錯誤,就像外國人在使用本國語言時可能發生的錯誤。Microsoft 不為內容的翻譯錯誤或客戶對該內容的使用所產生的任何錯誤或損害負責。Microsoft也同時將不斷地就機器翻譯軟體進行更新。
按一下這裡查看此文章的英文版本:956718
Microsoft及(或)其供應商不就任何在本伺服器上發表的文字資料及其相關圖表資訊的恰當性作任何承諾。所有文字資料及其相關圖表均以「現狀」供應,不負任何擔保責任。Microsoft及(或)其供應商謹此聲明,不負任何對與此資訊有關之擔保責任,包括關於適售性、適用於某一特定用途、權利或不侵權的明示或默示擔保責任。Microsoft及(或)其供應商無論如何不對因或與使用本伺服器上資訊或與資訊的實行有關而引起的契約、過失或其他侵權行為之訴訟中的特別的、間接的、衍生性的損害或任何因使用而喪失所導致的之損害、資料或利潤負任何責任。

提供意見

 

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