Fejl #: 50003167 (SQL-hotfix)
Du kan finde flere oplysninger om hovedlisten over builds, der blev udgivet efter SQL blev frigivet, ved at klikke på nedenstående artikelnummer for at få vist artiklen i Microsoft Knowledge Base:
957826 Hvor du kan finde flere oplysninger om de SQL Server 2008-builds, der blev udgivet efter SQL Server 2008, og de SQL Server 2005-builds, der blev udgivet efter SQL Server 2005 Service Pack 2
Symptomer
I Microsoft SQL Server 2008 gennemtvinges en begrænsning for en fremmed nøgle muligvis ikke, når følgende betingelser er opfyldt:
- Der udstedes en MERGE-sætning.
- Målkolonnen for opdateringen har et ikke-grupperet entydigt indeks.
Overvej følgende scenarie. Sætningen opdaterer en entydig kolonne, der kaldes Kolonne1 i en tabel, der hedder Tabel1. Tabel1 refereres til af en begrænsning for en fremmed nøgle fra en tabel, der hedder Tabel2.
Resultatet er, at rækkerne i Tabel1 ændres, når de ikke skulle have været det. Derudover vil Tabel2 have rækker, der har dinglende referencer til Tabel1.
Dette problem opstår i dette scenarie, når følgende betingelser er opfyldt:
Den refererede kolonne Kolonne1 i Tabel1 er ikke en del af klyngenøglen i Tabel1.
Der kan kun tildeles én mulig værdi til kolonnen Kolonne1 . Et af følgende scenarier sker f.eks.:
Flettekilden er en enkelt række med data. F.eks. er flettekilden fra en af følgende SELECT-sætninger:
-
select <ConstantValues> -
select <Parameters>
Bemærk, at dette scenarie er det mest sandsynlige scenarie.
-
Flettekilden er faktisk en enkelt række med data. F.eks. er flettekilden fra en af følgende SELECT-sætninger:
-
select <ColumnName> from <TableName> where <TableName>.<ColumnName> = 1Bemærk <Tabelnavn>.<ColumnName> er kendt af forespørgselsoptimering som en entydig værdi.
-
select top 1 <ColumnName> from <TableName>
-
Joinforbindelsen mellem flettekilden og flettedestinationen har et prædikat, der garanterer, at en enkelt række opdateres.
Opdateringsdelsætningen angiver kolonnen Kolonne1 til en konstant værdi, uanset kilden til fletningen.
Indstillingen VedOpdatering overlappende er ikke aktiveret for begrænsningen fremmed nøgle i Tabel2.
Bemærk! Vi anbefaler, at du anvender dette hotfix, hvis du bruger sætningen MERGE til at opdatere kolonner, der har entydige indekser, der ikke er grupperet, og som refereres til af fremmede nøglebegrænsninger.
Løsning
Rettelsen til dette problem blev først udgivet i Cumulative Update 1. Få flere oplysninger om, hvordan du får fat i denne kumulative opdateringspakke til SQL Server 2008, ved at klikke på nedenstående artikelnummer for at få vist artiklen i Microsoft Knowledge Base:
956717 kumulativ opdateringspakke 1 til SQL Server 2008
Bemærk, at da builds er kumulative, indeholder hver ny rettelsesversion alle de hotfixes og alle de sikkerhedsrettelser, der fulgte med den forrige version af SQL Server 2008-rettelsen. Vi anbefaler, at du overvejer at anvende den nyeste rettelsesversion, der indeholder dette hotfix. Du kan finde flere oplysninger ved at klikke på nedenstående artikelnummer for at få vist artiklen i Microsoft Knowledge Base:
956909 De SQL Server 2008-builds, der blev udgivet efter SQL Server 2008 blev udgivet
Løsning
Hotfixpakken eliminerer problemet. Hvis du bruger sætningen MERGE i det scenarie, der er beskrevet i afsnittet "Symptomer", og hvis du vælger ikke at anvende hotfixet, skal du følge disse trin for at eliminere problemet:
Omskriv sætningen MERGE så værdierne for flettekilden er i en tabel, midlertidig tabel eller tabelvariabel i stedet for at være indbygget i forespørgslen.
Brug sporingsflag 8790. Dette sporingsflag tvinger optimeringsfunktionen til at bruge en slags plan, der kaldes en bred opdateringsplan. Brede opdateringsplaner har ikke problemet. Dette trin indebærer præstationsrisici for alle DML-udsagn. Derfor bør du undgå at bruge dette trin, medmindre det er umuligt at ændre programmet.
Følgende Transact-SQL-script viser én måde, du kan ændre dit script på for at løse dette problem, hvis du ikke kan anvende dette hotfix.
Du har f.eks. et script, der ligner følgende:
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);
Skift scriptet, så det ser ud som følgende:
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);
Status
Microsoft har bekræftet, at dette er et problem i de Microsoft-produkter, der er angivet i afsnittet "Gælder for".
Flere oplysninger
Du kan finde flere oplysninger om, hvilke filer der ændres, og oplysninger om eventuelle forudsætninger for at anvende den kumulative opdateringspakke, der indeholder den hotfix, der er beskrevet i denne artikel i Microsoft Knowledge Base, ved at klikke på følgende artikelnummer for at få vist artiklen i Microsoft Knowledge Base:
956717 kumulativ opdateringspakke 1 til SQL Server 2008
Referencer
Få flere oplysninger om listen over builds, der er tilgængelige efter udgivelsen af SQL Server 2008, ved at klikke på nedenstående artikelnummer for at få vist artiklen i Microsoft Knowledge Base:
956909 De SQL Server 2008-builds, der blev udgivet efter SQL Server 2008 blev udgivet
Yderligere oplysninger om Incremental Servicing Model for SQL Server finder du ved at klikke på nedenstående artikelnummer for at få vist artiklen i Microsoft Knowledge Base:
935897 SQL Server teamet kan tilbyde en trinvis serviceringsmodel, som kan levere hotfixes til rapporterede problemer
Du kan finde flere oplysninger om navngivningsskemaet for opdateringer til SQL Server ved at klikke på nedenstående artikelnummer for at få vist artiklen i Microsoft Knowledge Base:
822499 Nyt navngivningsskema for Microsoft SQL Server-softwareopdateringspakker
Du kan finde flere oplysninger om terminologi for softwareopdateringer ved at klikke på nedenstående artikelnummer for at få vist artiklen i Microsoft Knowledge Base:
824684 Beskrivelse af den standardterminologi, der bruges om Microsoft-softwareopdateringer
Ikke-grupperede indekser i SQL Server 2008
Du kan finde flere oplysninger om ikke-grupperede indekser i SQL Server 2008 på følgende MSDN-websted (MSDN (Microsoft Developer Network)):