Oprava: Příkazu hromadné KORESPONDENCE nemusí vynutit omezení cizího klíče, pokud příkaz aktualizuje jedinečný klíčový sloupec, který není součástí clusteru klíče a jeden řádek je jako zdroj aktualizace SQL Server 2008

Chyba č: 50003167 (SQL Hotfix)
Další informace o hlavní seznam sestavení, které byly vydány po vydání SQL získáte v následujícím článku znalostní báze Microsoft Knowledge Base:

957826 kde lze najít další informace o SQL Server 2008 sestavení, které byly vydány po SQL Server 2008 a SQL Server 2005 vytvoří, které byly vydány po SQL Server 2005 Service Pack 2

Příznaky

V Microsoft SQL Server 2008 nelze vynutit omezení cizího klíče při jsou splněny následující podmínky:
  • Je vydán příkaz Sloučit.
  • Cílový sloupec aktualizace má jedinečný index bez clusterů.
Zvažte následující scénář. Příkaz aktualizuje jedinečný sloupec s názvem Sloupec1 tabulku s názvem tabulka1. Tabulka1 odkazuje omezení cizího klíče z tabulky s názvem tabulka2.

Výsledkem je změně řádků do tabulky Tabulka1 , jsou-li by neměl. Kromě toho tabulka2 mají řádky nepropojená odkazující na tabulka1.

V tomto scénáři se tento problém nastane, pokud jsou splněny následující podmínky:
  • V tabulka1 odkazovaného sloupce Sloupec1 není součástí clusteru klíče tabulka1.
  • Jedinou možnou hodnotou lze přiřadit sloupci Sloupec1 . Například dojde jedné z následujících scénářů:
    • Zdroj sloučení je jeden řádek s daty. Například zdroj korespondence je z jednoho z následujících příkazů select:
      • select <ConstantValues>
      • select <Parameters>
      Poznámka: V tomto scénáři je nejpravděpodobnější scénář.
    • Zdroj sloučení je skutečně jeden řádek s daty. Například zdroj korespondence je z jednoho z následujících příkazů select:
      • select <ColumnName> from <TableName> where <TableName>.<ColumnName> = 1
        Poznámka: < název_tabulky >. < Název_sloupce > známý optimalizátorem dotazů jedinečnou hodnotu.
      • select top 1 <ColumnName> from <TableName>
    • Spojení mezi zdrojem korespondence a sloučení cíle má predikát, který zaručuje, že budou aktualizovány na jednom řádku.
    • Klauzuli update nastaví sloupec Sloupec1 na konstantní hodnotu, bez ohledu na zdroj sloučení.
  • Na kaskádové aktualizace možnost není povolena v omezení cizího klíče v tabulka2.
Poznámka: Doporučujeme použít tuto opravu hotfix, pokud pomocí příkazu SLOUČENÍ aktualizovat sloupce, které mají neseskupené jedinečné indexy, které odkazuje omezení cizího klíče.

Řešení

Oprava tohoto problému byla vydána nejprve v kumulativní aktualizaci 1. Další informace o možnostech získání tohoto balíčku kumulativní aktualizace pro SQL Server 2008 získáte v následujícím článku znalostní báze Microsoft Knowledge Base:

956717 kumulativní aktualizace 1 pro SQL Server 2008

Poznámka: Vzhledem k tomu, sestavení jsou kumulativní, každá nová verze oprava obsahuje všechny opravy hotfix a opravit všechny opravy zabezpečení, které byly součástí předchozích SQL Server 2008 release. Doporučujeme zvážit použití nejnovější vydání oprava, která obsahuje tuto opravu hotfix. Další informace získáte klepnutím na následující číslo článku databáze Microsoft Knowledge Base:

956909 SQL Server 2008 sestavení, které byly vydány po vydání SQL Server 2008

Jak potíže obejít

Balíček oprav hotfix řeší problém. Pokud použijete příkaz Sloučit ve scénáři, která je popsána v části "Příznaky" a pokud se rozhodnete použít opravu hotfix, postupujte takto k odstranění tohoto problému:
  1. Přepište příkaz SLOUČENÍ tak, aby hodnoty pro zdroj sloučení jsou v tabulce, dočasná tabulka nebo tabulky proměnné namísto v-s linkami v dotazu.
  2. Použijte příznak trasování 8790. Tento příznak trasování vynutí Optimalizátor použít typ plánu, který se nazývá široký aktualizace plánu. Široký aktualizace plány nemají problém. Tento krok nese rizika výkonu pro všechny příkazy jazyk DML. Tedy neměli byste používat tento krok Pokud není možné změnit aplikaci.
Následující skript jazyka Transact-SQL ukazuje jeden způsob, jak změnit skript Chcete-li tento problém vyřešit, pokud nelze použít tuto opravu hotfix.

Například máte skript, který se podobá následující:
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);

Skript změňte tak, aby se podobá následující:
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);

Stav

Společnost Microsoft potvrdila, že se jedná o problém v produktech společnosti Microsoft, které jsou uvedeny v části "Platí pro".

Další informace

Další informace o jaké soubory byly změněny a informace o všechny požadavky nutné pro instalaci balíčku kumulativní aktualizace obsahující opravy hotfix popsané v tomto článku znalostní báze Microsoft Knowledge Base klepnutím na následující číslo článku databáze Microsoft Knowledge Base:
956717 kumulativní aktualizace 1 pro SQL Server 2008

Odkazy

Další informace o seznamu sestavení, které jsou k dispozici po vydání serveru SQL Server 2008 klepnutím na následující číslo článku databáze Microsoft Knowledge Base:

956909 SQL Server 2008 sestavení, které byly vydány po vydání SQL Server 2008



Další informace o přírůstkové Model servis pro SQL Server získáte v následujícím článku znalostní báze Microsoft Knowledge Base:

935897 dílčí Model obsluhy je k dispozici z týmu SQL Server doručit opravy hotfix pro nahlášené potíže



Další informace o schéma názvů pro aktualizace serveru SQL Server klepněte na následující číslo článku databáze Microsoft Knowledge Base:

822499 Nové schéma přidělování názvů balíčkům aktualizací softwaru Microsoft SQL Server pro


Pro další informace o terminologii používané v aktualizacích softwaru, klepněte na následující číslo článku k zobrazení článku v databázi Microsoft Knowledge Base:
824684 Popis standardní terminologie používané při popisu aktualizací softwaru společnosti Microsoft

Odkazy

Další informace o neseskupené indexy v SQL Server 2008 naleznete následujícím webu Microsoft Developer Network (MSDN):
Vlastnosti

ID článku: 956718 - Poslední kontrola: 14. 1. 2017 - Revize: 1

Váš názor