KB956718 - Ispravka: Naredba o OBJEDINJAVANJU možda neće primeniti ograničenje stranog ključa kada naredba ažurira jedinstvenu ključnu kolonu koja nije deo ključa klastera i postoji jedan red kao izvor ažuriranja u SQL Server 2008

Buba #: 50003167 (SQL hitna ispravka)

Za više informacija o glavnoj listi builda koje su objavljene nakon što je SQL objavljen kliknite na sledeći broj članka da biste videli članak u Microsoft bazi znanja:

957826 Gde možete da pronađete više informacija o SQL Server 2008 builds koje su objavljene nakon SQL Server 2008 i SQL Server 2005 builds koje su objavljene nakon SQL Server 2005 servisnog paketa 2

Simptomi

U sistemu Microsoft SQL Server 2008 ograničenje stranog ključa možda neće biti primenjeno kada su ispunjeni sledeći uslovi:

  • Izdata je izjava MERGE.

  • Ciljna kolona ispravke ima jedinstveni indeks koji nije izdvojen.

Razmotrite sledeći scenario. Izvod ažurira jedinstvenu kolonu koja se zove Kolona1 tabele koja se zove Tabela1. Na tabelu1 upućuje ograničenje stranog ključa iz tabele koja se zove Tabela2. Rezultat je da se redovi u tabeli1 menjaju kada nije trebalo da budu. Pored toga, Tabela2 će imati redove koji imaju zaslećujuće reference na tabelu1. Do ovog problema dolazi kada su ispunjeni sledeći uslovi:

  • Referentna kolona1 u tabeli "Tabela1" nije deo ključa klastera tabele1.

  • Koloni Kolona1 može biti dodeljena samo jedna moguća vrednost. Na primer, dešava se jedan od sledećih scenarija:

    • Izvor objedinjavanja je jedan red podataka. Na primer, izvor objedinjavanja je iz jedne od sledećih odabranih izjava:

      • select <ConstantValues>
      • select <Parameters>

      Napomena Ovaj scenario je najverovatnije scenario.

    • Izvor objedinjavanja je zapravo jedan red podataka. Na primer, izvor objedinjavanja je iz jedne od sledećih odabranih izjava:

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

        Napomena< ime tabele>.<ime>je optimizator upita poznat kao jedinstvena vrednost.

      • select top 1 <ColumnName> from <TableName>
    • Spoj između izvora objedinjavanja i cilja objedinjavanja ima predikat koji garantuje da će jedan red biti ažuriran.

    • Odredba o ažuriranju postavlja kolonu Kolona1 na konstantnu vrednost, bez obzira na izvor objedinjavanja.

  • Opcija "Prilikom ažuriranja kaskadno" nije omogućena za ograničenje stranog ključa u tabeli2.

Napomena Preporučujemo da primenite ovu hitnu ispravku ako koristite izvod MERGE da biste ažurirali kolone na kojima ne postoje jedinstveni indeksi na koje upućuju ograničenja stranog ključa.

Rešenje

Ispravka za ovaj problem je prvi put objavljena u kumulativnoj ispravci 1. Za više informacija o nabavljanju ovog paketa kumulativnih ispravki za SQL Server 2008 kliknite na sledeći broj članka da biste videli članak u Microsoft bazi znanja:

956717 Kumulativni paket ispravki 1 za SQL Server 2008Napomena Pošto su verzije kumulativne, svako novo izdanje ispravke sadrži sve hitne ispravke i sve bezbednosne ispravke koje su bile uključene u prethodno izdanje ispravke za SQL Server 2008. Preporučujemo da razmislite o primeni najnovijeg izdanja ispravke koje sadrži ovu hitnu ispravku. Za više informacija kliknite na sledeći broj članka da biste videli članak u Microsoft bazi znanja:

956909 SQL Server 2008 builds koji su objavljeni nakon što je SQL Server 2008 objavljen

Rešenje

Paket hitnih ispravki eliminiše problem. Ako funkciju MERGE koristite u scenariju koji je opisan u odeljku "Simptomi" i ako odaberete da ne primenite hitnu ispravku, sledite ove korake da biste eliminisali ovaj problem:

  1. Ponovo nađite izvod MERGE tako da se vrednosti za izvor objedinjavanja naći u tabeli, privremenoj tabeli ili promenljivoj tabele umesto da budu poređane u upitu.

  2. Koristite zastavicu za praćenje 8790. Ova zastavica za praćenje primorava optimizator da koristi neku vrstu plana koji se naziva široki plan ažuriranja. Planovi širokog ažuriranja nemaju problem. Ovaj korak nosi rizike performansi za sve DML izjave. Zbog toga bi trebalo da izbegavate korišćenje ovog koraka ukoliko nije nemoguće promeniti aplikaciju.

Sledeća Transact-SQL skripta prikazuje jedan način da promenite skriptu da biste rešili ovaj problem ako ne možete da primenite ovu hitnu ispravku. Na primer, imate skriptu koja je slična sledećoj:

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

Promenite skriptu tako da bude slična sledećoj:

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 je ovo problem u Microsoft proizvodima koji su navedeni u odeljku "Odnosi se na".

Više informacija

Za više informacija o tome koje datoteke se menjaju i za informacije o bilo kojim preduslovima za primenu paketa kumulativnih ispravki koji sadrži hitnu ispravku opisanu u ovom članku Microsoft baze znanja kliknite na sledeći broj članka da biste videli članak u Microsoft bazi znanja:

956717 Kumulativni paket ispravki 1 za SQL Server 2008

Reference

Za više informacija o listi dostupnih buildova nakon izdavanja sistema SQL Server 2008 kliknite na sledeći broj članka da biste videli članak u Microsoft bazi znanja:

956909 SQL Server 2008 builds koji su objavljeni nakon što je SQL Server 2008 objavljenZa više informacija o postepenom modelu servisiranja za SQL Server kliknite na sledeći broj članka da biste videli članak u Microsoft bazi znanja:

935897 Sql Server tim je dostupan u SQL Server timu za isporuku hitnih ispravki za prijavljene problemeZa više informacija o šemi imenovanja za ispravke sistema SQL Server kliknite na sledeći broj članka da biste videli članak u Microsoft bazi znanja:

822499Nova šema imenovanja za pakete softverskih ispravki za Microsoft SQL ServerZa više informacija o terminologiji softverskih ispravki kliknite na sledeći broj članka da biste videli članak u Microsoft bazi znanja:

824684 Opis standardne terminologije koja se koristi za opisivanje Microsoft softverskih ispravki

Reference

Za više informacija o indeksima koji nisu izdvojeni u sistemu SQL Server 2008 posetite sledeću Microsoft Developer Network (MSDN) Web lokaciju:

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

Potrebna vam je dodatna pomoć?

Unapredite veštine
Istražite obuku
Prvi nabavite nove funkcije
Pridružite se Microsoft insajdere

Da li su vam ove informacije koristile?

Hvala vam na povratnim informacijama!

Hvala za povratne informacije! Izgleda da će biti od pomoći ako vas povežemo sa našim agentima Office podrške.

×