Eroare #: 50003167 (Remediere rapidă SQL)
Pentru mai multe informații despre lista coordonatoare a compilărilor lansate după lansarea SQL, faceți clic pe următorul număr de articol pentru a vedea articolul în Baza de cunoștințe Microsoft:
957826 Unde puteți găsi mai multe informații despre compilările SQL Server 2008 care au fost lansate după SQL Server 2008 și compilările SQL Server 2005 care au fost lansate după SQL Server 2005 Service Pack 2
Simptome
În Microsoft SQL Server 2008, o restricție pentru cheia străină nu poate fi impusă atunci când se îndeplinesc următoarele condiții:
- Este emis o instrucțiune MERGE.
- Coloana țintă a actualizării are un index unic negrupat.
Luați în considerare următorul scenariu. Instrucțiunea actualizează o coloană unică denumită Coloana1 a unui tabel denumit Tabel1. Tabel1 este menționat de o restricție de cheie străină dintr-un tabel denumit Tabel2.
Rezultatul este că rândurile din Tabel1 se modifică și nu ar fi trebuit. În plus, Tabel2 va avea rânduri care au referințe atârnate la Tabel1.
Această problemă apare pentru acest scenariu atunci când se îndeplinesc următoarele condiții:
Coloana Coloana1 la care se face referire în Tabel1 nu face parte din cheia de grupare a Tabel1.
Coloana Coloana1 poate fi atribuită o singură valoare posibilă. De exemplu, are loc unul dintre următoarele scenarii:
Sursa îmbinării este un singur rând de date. De exemplu, sursa de îmbinare provine dintr-una dintre următoarele instrucțiuni SELECT:
-
select <ConstantValues> -
select <Parameters>
Notă: acest scenariu este scenariul cel mai probabil.
-
Sursa îmbinării este de fapt un singur rând de date. De exemplu, sursa de îmbinare provine dintr-una dintre următoarele instrucțiuni SELECT:
-
select <ColumnName> from <TableName> where <TableName>.<ColumnName> = 1Notă <NumeTabel>.<ColumnName> este cunoscut de optimizatorul de interogări ca fiind o valoare unică.
-
select top 1 <ColumnName> from <TableName>
-
Asocierea dintre sursa de îmbinare și ținta îmbinării are un predicat care garantează că se va actualiza un singur rând.
Clauza update setează coloana Coloana1 la o valoare constantă, indiferent de sursa îmbinării.
Opțiunea La actualizare în cascadă nu este activată din restricția de cheie străină din Tabel2.
Notă: Vă recomandăm să aplicați această remediere rapidă dacă utilizați instrucțiunea MERGE pentru a actualiza coloane care au indexuri unice negrupate la care fac referire restricții de cheie străină.
Rezolvare
Remedierea pentru această problemă a fost lansată pentru prima dată în actualizarea cumulativă 1. Pentru mai multe informații despre cum se obține acest pachet de actualizări cumulative pentru SQL Server 2008, faceți clic pe următorul număr de articol pentru a vedea articolul în Baza de cunoștințe Microsoft:
956717 Pachetul de actualizare cumulativă 1 pentru SQL Server 2008
Notă: deoarece compilările sunt cumulative, fiecare lansare de remediere nouă conține toate remedierile rapide și toate remedierile de securitate care au fost incluse cu lansarea anterioară de remedieri SQL Server 2008. Vă recomandăm să luați în considerare aplicarea celei mai recente remedieri care conține această remediere rapidă. Pentru mai multe informații, faceți clic pe următorul număr de articol pentru a-l vedea în Baza de cunoștințe Microsoft:
956909 Compilările SQL Server 2008 care au fost lansate după lansarea SQL Server 2008
Soluție
Pachetul de remediere rapidă elimină problema. Dacă utilizați instrucțiunea MERGE în situația descrisă în secțiunea "Simptome" și dacă alegeți să nu aplicați remedierea rapidă, urmați acești pași pentru a elimina această problemă:
Rescrieți instrucțiunea MERGE, astfel încât valorile pentru sursa îmbinării să fie într-un tabel, un tabel temporar sau o variabilă de tabel, în loc să fie aliniate în interogare.
Utilizați semnalizarea de urmărire 8790. Această semnalizare de urmărire obligă optimizatorul să utilizeze un tip de plan denumit plan de actualizare larg. Planurile de actualizare pe plan larg nu au nicio problemă. Acest pas implică riscuri de performanță pentru toate instrucțiunile DML. Prin urmare, se recomandă să evitați utilizarea acestui pas dacă nu este imposibil să modificați aplicația.
Următorul script Transact-SQL vă arată o modalitate de a modifica scriptul pentru a rezolva această problemă dacă nu puteți aplica această remediere rapidă.
De exemplu, aveți un script care seamănă cu următorul:
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);
Modificați scriptul astfel încât să semene cu următorul:
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);
Stare
Microsoft a confirmat că aceasta este o problemă în produsele Microsoft care sunt listate în secțiunea „Se aplică la”.
Mai multe informații
Pentru mai multe informații despre fișierele modificate și pentru informații despre cerințele preliminare pentru aplicarea pachetului de actualizare cumulativă care conține remedierea rapidă descrisă în acest articol din Baza de cunoștințe Microsoft, faceți clic pe următorul număr de articol pentru a vedea articolul în Baza de cunoștințe Microsoft:
956717 Pachetul de actualizare cumulativă 1 pentru SQL Server 2008
Referințe
Pentru mai multe informații despre lista de compilări disponibile după lansarea SQL Server 2008, faceți clic pe următorul număr de articol pentru a vedea articolul în Baza de cunoștințe Microsoft:
956909 Compilările SQL Server 2008 care au fost lansate după lansarea SQL Server 2008
Pentru informații suplimentare despre modelul incremental de service pentru SQL Server, faceți clic pe următorul număr de articol pentru a vedea articolul în Baza de cunoștințe Microsoft:
935897 Un model incremental de service este disponibil de la echipa SQL Server pentru a livra remedieri rapide pentru problemele raportate
Pentru mai multe informații despre schema de denumire pentru actualizările SQL Server, faceți clic pe următorul număr de articol pentru a vedea articolul în Baza de cunoștințe Microsoft:
822499 Schemă de denumire nouă pentru pachetele de actualizare a software-ului Microsoft SQL Server
Pentru informații suplimentare despre terminologia actualizărilor de software, faceți clic pe următorul număr de articol pentru a vedea articolul în Baza de cunoștințe Microsoft:
824684 Descrierea terminologiei standard care este utilizată pentru a descrie actualizările de software Microsoft
Indexuri negrupate în SQL Server 2008
Pentru mai multe informații despre indexurile negrupate din SQL Server 2008, vizitați următorul site Web Rețea Microsoft pentru dezvoltatori (MSDN):