KB956718-FIX: naredba spoji možda neće nametnuti ograničenje vanjskog ključa kada naredba ažurira jedinstveni stupac s ključem koji nije dio ključa za grupiranje i postoji jedan redak kao izvor ažuriranja u sustavu SQL Server 2008

Bug #: 50003167 (SQL hotfix)

Dodatne informacije o glavnom popisu osnovica koje su objavljene nakon objavljivanja SQL-a potražite u članku iz Microsoftove baze znanja pod sljedećim brojem:

957826 Gdje možete pronaći dodatne informacije o izradi sustava SQL Server 2008 koje su objavljene nakon SQL Servera 2008 i SQL Server 2005 gradi koje su objavljene nakon SQL Server 2005 Service Pack 2

Simptomi

U sustavu Microsoft SQL Server 2008 ograničenje vanjskog ključa ne može se primjenjivati kada su ispunjeni sljedeći uvjeti:

  • Izdana je naredba spoji.

  • Ciljni stupac ažuriranja sadrži negrupirani jedinstveni indeks.

Razmotrite sljedeći scenarij. Naredba obnavlja jedinstveni stupac koji se zoveTable1 Broj na kojoj se upućuje ograničenje vanjskog ključa iz tablice koja se zove Tablica2. Rezultat je u tome što su se reci u programu Tablica1 promijenili kada nisu trebali biti. Uz to, Tablica2 će imati retke koji imaju viseće reference na Tablica1. Taj se problem pojavljuje u ovom scenariju kada su ispunjeni sljedeći uvjeti:

  • Stupac s referenciranog u programuTable1

  • Stupcu je moguće dodijeliti samo jednu moguću vrijednost. Na primjer, pojavljuje se jedan od sljedećih scenarija:

    • Izvor spajanja jedan je redak podataka. Izvor spajanja, primjerice, potječe iz jedne od sljedećih naredbi SELECT:

      • select <ConstantValues>
      • select <Parameters>

      Napomena Ovaj je scenarij najverovatnije scenarij.

    • Izvor spajanja zapravo je jedan redak podataka. Izvor spajanja, primjerice, potječe iz jedne od sljedećih naredbi SELECT:

      • select <ColumnName> from <TableName> where <TableName>.<ColumnName> = 1

        Notes<tablename>.<ColumnName> je poznat pomoću alata za optimizaciju upita da bi bila jedinstvena vrijednost.

      • select top 1 <ColumnName> from <TableName>
    • Spajanje između izvora spajanja i cilja spajanja sadrži prediup koji garantira da će se jedan redak ažurirati.

    • Uvjet Update postavlja stupac na Constant u konstantnu vrijednost, bez obzira na izvor spajanja.

  • Mogućnost u odjeljku Ažuriranje kaskadnog dodatka nije omogućena za ograničenje vanjskog ključa u Tablica2.

Napomena Preporučujemo da taj hitni popravak primijenite ako koristite naredbu spoji za ažuriranje stupaca koji imaju negrupirani jedinstveni indeksi na koje se upućuju ograničenja vanjskog ključa.

Rješenje

Popravak tog problema prvi je put izdan u kumulativnom ažuriranju 1. Dodatne informacije o dobivanju tog kumulativnog paketa za ažuriranje za SQL Server 2008 potražite u članku iz Microsoftove baze znanja pod sljedećim brojem:

956717 Kumulativno ažuriranje paketa 1 za SQL Server 2008Notes Budući da su grade kumulativne, svako novo izdanje ispravaka sadrži sve hitne popravke i sve sigurnosne popravke koji su bili obuhvaćeni prethodnim izdanjima sustava SQL Server 2008 Fix. Preporučujemo da razmotrite primjenu najnovijeg izdanja popravka koja sadrži taj hitni popravak. Dodatne informacije potražite u članku iz Microsoftove baze znanja pod sljedećim brojem:

956909 Verzije sustava SQL Server 2008 koje su objavljene nakon objavljivanja sustava SQL Server 2008

Zaobilazno rješenje

Paket s hitnim popravkom uklanja problem. Ako koristite naredbu Spoji u scenariju opisan u odjeljku "simptomi", a ako odlučite da ne želite primijeniti hitni popravak, slijedite ove korake da biste uklonili taj problem:

  1. Ponovno napišite naredbu za spajanje da bi se vrijednosti za izvor spajanja prikazivale u tablici, temp tablici ili varijabli tablice, a ne u upitu.

  2. Upotrijebite oznaku Trace 8790. Ova zastavica praćenja prisiljava alat za optimizaciju da koristi neku vrstu tarife koja se naziva širok plan za ažuriranje. Širok plan ažuriranja nema problema. U ovom se koraku prenose rizici performansi za sve DUVE naredbe. Zbog toga biste trebali izbjegavati korištenje ovog koraka, osim ako nije moguće promijeniti aplikaciju.

U sljedećem skriptom Transact-SQL prikazuje se jedan način promjene skripte da biste riješili taj problem ako ne možete primijeniti taj hitni popravak. Na primjer, imate skriptu koja nalikuje sljedećem:

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);

Promijenite skriptu tako da liči na sljedeće:

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);

Status

Microsoft je potvrdio da se radi o problemu u Microsoftovim proizvodima navedenim u odjeljku "odnosi se na".

Dodatne informacije

Dodatne informacije o promjeni datoteka i informacije o bilo kakvim preduvjetima za primjenu kumulativnog paketa ažuriranja koji sadrži hitni popravak opisan u ovom članku iz Microsoftove baze znanja potražite u članku iz Microsoftove baze znanja pod sljedećim brojem:

956717 Kumulativno ažuriranje paketa 1 za SQL Server 2008

Reference

Dodatne informacije o popisu osnovica koje su dostupne nakon objavljivanja sustava SQL Server 2008 potražite u članku iz Microsoftove baze znanja pod sljedećim brojem:

956909 Verzije sustava SQL Server 2008 koje su objavljene nakon objavljivanja sustava SQL Server 2008Dodatne informacije o modelu programa inkrementalni servis za SQL Server potražite u članku iz Microsoftove baze znanja pod sljedećim brojem:

935897 U timu SQL Server dostupan je inkrementalni servisni model za isporuku hitnih popravaka za prijavljene problemeDodatne informacije o shemi imenovanja za ažuriranja sustava SQL Server potražite u članku iz Microsoftove baze znanja pod sljedećim brojem:

822499Nova shema imenovanja za pakete softverskih ažuriranja za Microsoft SQL ServerDodatne informacije o terminologiji za softversko ažuriranje potražite u članku iz Microsoftove baze znanja pod sljedećim brojem:

824684 Opis standardne terminologije koja se koristi za opisivanje ažuriranja Microsoftova softvera

Reference

Dodatne informacije o neklasteriranim indeksama u sustavu SQL Server 2008 potražite na sljedećem web-mjestu Microsoft Developer Network (MSDN):

http://msdn.microsoft.com/en-us/library/ms179325(SQL.100).aspx

Potrebna vam je dodatna pomoć?

Proširite svoje vještine
Istražite osposobljavanje
Prvi koristite nove značajke
Pridružite se Microsoft Insidere

Jesu li ove informacije bile korisne?

Hvala vam na povratnim informacijama!

Hvala vam na povratnim informacijama! Čini se da bi vam pomoglo kad bismo vas povezali s nekim od naših agenata podrške za Office.

×