Hata #: 50003167 (SQL Düzeltmesi)
SQL yayınlandıktan sonra yayınlanan derlemelerin ana listesi hakkında daha fazla bilgi için Microsoft Bilgi Bankası'ndaki makaleyi görüntülemek üzere aşağıdaki makale numarasına tıklayın:
957826 SQL Server 2008'den sonra yayımlanan SQL Server 2008 derlemeleri ve SQL Server 2005 Service Pack 2'den sonra yayımlanan SQL Server 2005 derlemeleri hakkında daha fazla bilgiyi bulabileceğiniz yer
Belirtiler
Microsoft SQL ServerSQL Server 2008'de, aşağıdaki koşullar doğru olduğunda yabancı anahtar kısıtlaması uygulanamayabilir:
- Bir MERGE deyimi yayınlandı.
- Güncelleştirmenin hedef sütununda kümelenmemiş benzersiz bir dizin bulunuyor.
Aşağıdaki senaryoyu ele alalım. Deyim, Tablo1 adlı bir tablonun Sütun1 adlı benzersiz sütununu güncelleştirir. Tablo1'e , Tablo2 adlı bir tablodan yabancı anahtar kısıtlaması tarafından başvurulur.
Sonuçta, Tablo1'deki satırlar değiştirilmemesi gereken bir zamanda değiştirilir. Ayrıca, Tablo2'de Tablo1'e sarkan başvuruları olan satırlar olacaktır.
Bu senaryoda aşağıdaki koşullar doğru olduğunda bu sorun oluşur:
Tablo1'de başvurulan Sütun1 sütunu, Tablo1'in kümeleme anahtarının bir parçası değildir.
Sütun1 sütununa yalnızca bir olası değer atanabilir. Örneğin, aşağıdaki senaryolardan biri gerçekleşir:
Birleştirme kaynağı, tek bir veri satırıdır. Örneğin, birleştirme kaynağı aşağıdaki select deyimlerinden birindendir:
-
select <ConstantValues> -
select <Parameters>
Not: Bu senaryo en olası senaryodur.
-
Birleştirme kaynağı aslında tek bir veri satırıdır. Örneğin, birleştirme kaynağı aşağıdaki select deyimlerinden birindendir:
-
select <ColumnName> from <TableName> where <TableName>.<ColumnName> = 1TableName'e> dikkat edin<.<ColumnName>, sorgu iyileştiricisi tarafından benzersiz bir değer olarak bilinir.
-
select top 1 <ColumnName> from <TableName>
-
Birleştirme kaynağı ile birleştirme hedefi arasındaki birleştirme, tek bir satırın güncelleştirilmesini garanti eden bir koşula sahiptir.
Update yan tümcesi, birleştirme kaynağından bağımsız olarak Sütun1 sütununu sabit bir değere ayarlar.
Tablo2'deki yabancı anahtar kısıtlamasında Güncelleştirme Basamaklaması seçeneği etkin değil.
Not Yabancı anahtar kısıtlamaları tarafından başvurulan kümelenmemiş benzersiz dizinlere sahip sütunları güncelleştirmek için MERGE deyimini kullanıyorsanız bu düzeltmeyi uygulamanızı öneririz.
Çözüm
Bu soruna yönelik düzeltme ilk olarak Toplu Güncelleştirme 1'de yayınlandı. Bu SQL Server 2008 toplu güncelleştirme paketini edinme hakkında daha fazla bilgi için Microsoft Bilgi Bankası'ndaki makaleyi görüntülemek üzere aşağıdaki makale numarasına tıklayın:
SQL Server 2008 için 956717 Toplu Güncelleştirme Paketi 1
Not Derlemeler birikimli olduğundan, her yeni düzeltme önceki SQL Server 2008 düzeltme sürümünde yer alan tüm düzeltmeleri ve tüm güvenlik düzeltmelerini içerir. Bu düzeltmeyi içeren en son düzeltme sürümünü uygulamayı düşünmenizi öneririz. Daha fazla bilgi için Microsoft Bilgi Bankası'ndaki makaleyi görüntülemek üzere aşağıdaki makale numarasına tıklayın:
956909 SQL Server 2008 yayımlandıktan sonra yayımlanan SQL Server 2008 derlemeleri
Geçici çözüm
Düzeltme paketi sorunu ortadan kaldırır. "Belirtiler" bölümünde açıklanan senaryoda MERGE deyimini kullanırsanız ve düzeltmeyi uygulamamayı seçerseniz, bu sorunu gidermek için aşağıdaki adımları izleyin:
MERGE deyimini yeniden yazarak, birleştirme kaynağının değerlerinin sorguda satır içi yerine bir tablo, geçici tablo veya tablo değişkeni içinde yer almasını sağlayın.
8790 izleme bayrağını kullanın. Bu izleme bayrağı, iyileştiriciyi geniş güncelleştirme planı adı verilen bir plan türünü kullanmaya zorlar. Geniş güncelleme planlarında sorun yok. Bu adım tüm DML deyimleri için performans riskleri taşır. Bu nedenle, uygulamayı değiştirmek imkansız olmadıkça bu adımı kullanmaktan kaçınmalısınız.
Aşağıdaki Transact-SQL betiği, bu düzeltmeyi uygulayamazsanız, bu sorunu çözmek için betiğinizi değiştirmenin bir yolunu gösterir.
Örneğin, aşağıdakine benzer bir betiğiniz vardır:
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);
Komut dosyasını aşağıdaki gibi görünecek şekilde değiştirin:
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);
Durum
Microsoft bunun, "Şunlar için geçerlidir" bölümünde listelenen Microsoft ürünlerinde sorun olduğunu doğrulamıştır.
Daha Fazla Bilgi
Değiştirilen dosyalar hakkında ve bu Microsoft Bilgi Bankası makalesinde açıklanan düzeltmeyi içeren toplu güncelleştirme paketini uygulamaya yönelik önkoşullar hakkında daha fazla bilgi için Microsoft Bilgi Bankası'ndaki makaleyi görüntülemek üzere aşağıdaki makale numarasına tıklayın:
SQL Server 2008 için 956717 Toplu Güncelleştirme Paketi 1
Başvurular
SQL Server 2008'in yayınlanmasından sonra kullanılabilen yapıların listesi hakkında daha fazla bilgi için Microsoft Bilgi Bankası'ndaki makaleyi görüntülemek üzere aşağıdaki makale numarasına tıklayın:
956909 SQL Server 2008 yayımlandıktan sonra yayımlanan SQL Server 2008 derlemeleri
SQL Server için Artımlı Hizmet Modeli hakkında daha fazla bilgi için Microsoft Bilgi Bankası'ndaki makaleyi görüntülemek üzere aşağıdaki makale numarasına tıklayın:
935897 Bildirilen sorunlara yönelik düzeltmeler sağlamak için SQL Server ekibi tarafından bir Artımlı Bakım Modeli sağlanır
SQL Server güncelleştirmelerin adlandırma şeması hakkında daha fazla bilgi için Microsoft Bilgi Bankası'ndaki makaleyi görüntülemek üzere aşağıdaki makale numarasına tıklayın:
822499 Microsoft SQL Server yazılım güncelleştirme paketleri için yeni adlandırma şeması
Yazılım güncelleştirme terminolojisi hakkında daha fazla bilgi için Microsoft Bilgi Bankası'ndaki makaleyi görüntülemek üzere aşağıdaki makale numarasına tıklayın:
824684 Microsoft yazılım güncelleştirmelerini açıklamak için kullanılan standart terminolojinin açıklaması
Nonclustered indexes in SQL ServerSQL Server 2008
SQL Server 2008'de kümelenmemiş dizinler hakkında daha fazla bilgi için aşağıdaki Microsoft Developer Network (MSDN) Web sitesini ziyaret edin: