Kļūda #: 50003167 (SQL labojumfails)
Lai iegūtu papildinformāciju par būvējumu pamatsarakstu, kas tika izlaisti pēc SQL valodas izlaišanas, noklikšķiniet uz šī raksta numura un lasiet Microsoft zināšanu bāzes rakstu:
957826 Kur var atrast papildinformāciju par SQL Server 2008 būvējumiem, kas tika izlaisti pēc SQL Server 2008, un SQL Server 2005 būvējumiem, kas tika izlaisti pēc SQL Server 2005 2. servisa pakotnes
Pazīmes
Programmā Microsoft SQL SQL Server 2008 ārējās atslēgas ierobežojums var netikt piemērots, ja ir šādi nosacījumi:
- Tiek izdots paziņojums par MERGE.
- Atjauninājuma mērķa kolonnai ir nesagrupēts unikālais indekss.
Apsveriet šādu scenāriju. Priekšraksts atjaunina unikālu kolonnu Kolonna1 tabulā, kuras nosaukums ir Table1. Tabula1 atsaucas ārējās atslēgas ierobežojums no tabulas ar nosaukumu Table2.
Rezultātā tabulā Table1 rindas tiek mainītas, kad tām nevajadzēja būt. Turklāt vērtībai Tabula2 būs rindas, kurās ir pārkaras atsauces uz Tabulu1.
Šī problēma rodas šajā scenārijā, ja ir izpildīti tālāk norādītie nosacījumi.
Kolonna, uz kuru ir atsauce Kolonna1 tabulā1, nav daļa no tabulas1 klasteru atslēgas.
Kolonna1 kolonnai var piešķirt tikai vienu iespējamo vērtību. Piemēram, rodas viens no šiem scenārijiem:
Sapludināšanas avots ir viena datu rinda. Piemēram, sapludināšanas avots ir no kāda no šiem atlases priekšrakstiem:
-
select <ConstantValues> -
select <Parameters>
Piezīme: šis scenārijs ir visticamākais scenārijs.
-
Sapludināšanas avots faktiski ir viena datu rinda. Piemēram, sapludināšanas avots ir no kāda no šiem atlases priekšrakstiem:
-
select <ColumnName> from <TableName> where <TableName>.<ColumnName> = 1Piezīme< TableName>.<Vaicājumu optimizētājs zina, ka ColumnName> ir unikāla vērtība.
-
select top 1 <ColumnName> from <TableName>
-
Savienojumam starp sapludināšanas avotu un sapludināšanas mērķi ir predikāts, kas garantē atsevišķas rindas atjaunināšanu.
Klauzula Update iestata kolonnas Kolonna1 konstantu vērtību neatkarīgi no sapludināšanas avota.
Opcija Pēc atjaunināšanas kaskāde nav iespējota ārējās atslēgas ierobežojumam Table2.
Piezīme Šo labojumfailu ieteicams lietot, ja izmantojat priekšrakstu MERGE, lai atjauninātu kolonnas, kurās ir nesagrupēti unikāli indeksi, uz kuriem atsaucas ārējo atslēgu ierobežojumi.
Risinājums
Šīs problēmas labojums pirmo reizi tika izlaists 1. kumulatīvajā atjauninājumā. Lai iegūtu papildinformāciju par to, kā iegūt šo kumulatīvā atjauninājuma pakotni produktam SQL Server 2008, noklikšķiniet uz šī raksta numura un lasiet Microsoft zināšanu bāzes rakstu:
956717 1. kumulatīvo atjauninājumu pakotne sistēmai SQL Server 2008
Piezīme Tā kā būvējumi ir kumulatīvi, katrs jaunais labojumu laidiens ietver visus labojumfailus un drošības labojumus, kas bija iekļauti iepriekšējā SQL Server 2008 labojumu laidienā. Iesakām apsvērt tā labojumfaila lietošanu, kurā ir iekļauts šis labojumfails. Lai iegūtu papildinformāciju, noklikšķiniet uz tālāk norādītā raksta numura un lasiet Microsoft zināšanu bāzes rakstu:
956909 SQL Server 2008. gada būvējumi, kas tika izlaisti pēc 2008. gada SQL Server, tika izlaisti
Risinājums
Labojumfailu pakotne novērš šo problēmu. Ja izmantojat priekšrakstu MERGE scenārijā, kas aprakstīts sadaļā "Simptomi" un izvēlaties nelietot labojumfailu, veiciet šīs darbības, lai novērstu šo problēmu:
Pārrakstiet priekšrakstu MERGE tā, lai sapludināšanas avota vērtības būtu tabulā, pagaidu tabulā vai tabulas mainīgajā, nevis iekļautas vaicājumā.
Izmantot izsekošanas karodziņu 8790. Šis izsekošanas karodziņš liek optimizētājam izmantot sava veida plānu, kas tiek dēvēts par plašas atjaunināšanas plānu. Plašas atjaunināšanas plāniem šī problēma nerodas. Šī darbība ietver visu DML priekšrakstu veiktspējas riskus. Tāpēc neizmantojiet šo darbību, ja vien nav iespējams mainīt lietojumprogrammu.
Tālāk esošajā Transact-SQL skriptā ir parādīts viens veids, kā mainīt skriptu, lai novērstu šo problēmu, ja nevarat lietot šo labojumfailu.
Piemēram, jums ir skripts, kas ir līdzīgs šim:
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);
Mainiet skriptu, lai tas izskatītos līdzīgi šim:
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);
Statuss
Microsoft apstiprināja, ka šī ir problēma Microsoft produktos, kas norādīti sadaļā "attiecas uz".
Papildinformācija
Lai iegūtu papildinformāciju par to, kādi faili ir mainīti, un informāciju par priekšnosacījumiem, lai lietotu kumulatīvo atjauninājumu pakotni, kas satur labojumfailu, kā aprakstīts šajā Microsoft zināšanu bāzes rakstā, noklikšķiniet uz tālāk norādītā raksta numura un lasiet Microsoft zināšanu bāzes rakstu:
956717 1. kumulatīvo atjauninājumu pakotne sistēmai SQL Server 2008
Atsauces
Lai iegūtu papildinformāciju par to būvējumu sarakstu, kas ir pieejami pēc SQL Server 2008 izlaišanas, noklikšķiniet uz šī raksta numura un lasiet Microsoft zināšanu bāzes rakstu:
956909 SQL Server 2008. gada būvējumi, kas tika izlaisti pēc 2008. gada SQL Server, tika izlaisti
Lai iegūtu papildinformāciju par SQL Server inkrementālās apkalpošanas modeli, noklikšķiniet uz šī raksta numura un lasiet Microsoft zināšanu bāzes rakstu:
935897 SQL Server komanda piedāvā inkrementālo apkalpošanas modeli, lai nodrošinātu labojumfailus ziņoto problēmu gadījumā
Lai iegūtu papildinformāciju par SQL Server atjauninājumu nosaukumdošanas shēmu, noklikšķiniet uz šī raksta numura un lasiet Microsoft zināšanu bāzes rakstu:
822499 Jauna Microsoft SQL Server programmatūras atjauninājumu pakotņu nosaukumdošanas shēma
Lai iegūtu papildinformāciju par programmatūras atjaunināšanas terminoloģiju, noklikšķiniet uz tālāk norādītā raksta numura un lasiet Microsoft zināšanu bāzes rakstu:
824684 Standarta terminoloģijas apraksts, kas tiek izmantots Microsoft programmatūras atjauninājumu aprakstīšanai
Nesagrupēti indeksi SQL Server 2008
Lai iegūtu papildinformāciju par nesagrupētiem indeksiem programmā SQL Server 2008, apmeklējiet šo Microsoft izstrādātāju tīkla (MSDN) vietni: