Bug #: 50003167 (Hotfix SQL)
Untuk informasi selengkapnya tentang daftar master build yang dirilis setelah SQL dirilis, klik nomor artikel berikut untuk melihat artikel di Pangkalan Pengetahuan Microsoft:
957826 Tempat Anda dapat menemukan informasi selengkapnya tentang build SQL Server 2008 yang dirilis setelah SQL Server 2008 dan build SQL Server 2005 yang dirilis setelah SQL Server 2005 Paket Layanan 2
Gejala
Di Microsoft SQL Server 2008, batasan kunci asing mungkin tidak diberlakukan jika kondisi berikut ini benar:
- Pernyataan MERGE dikeluarkan.
- Kolom target pembaruan memiliki indeks unik yang tidak dikelompokkan.
Pertimbangkan skenario berikut. Pernyataan ini memperbarui kolom unik yang bernama Kolom1 dari tabel yang bernama Tabel1. Tabel1 direferensikan oleh batasan kunci asing dari tabel yang bernama Tabel2.
Hasilnya adalah bahwa baris di Tabel1 diubah ketika seharusnya tidak diubah. Selain itu, Tabel2 akan memiliki baris yang memiliki referensi menjuntai ke Tabel1.
Masalah ini terjadi untuk skenario ini jika kondisi berikut ini benar:
Kolom Kolom1 yang direferensikan di Tabel1 bukan merupakan bagian dari kunci pengelompokan Tabel1.
Hanya satu nilai yang mungkin dapat ditetapkan ke kolom Kolom1 . Misalnya, salah satu skenario berikut akan terjadi:
Sumber gabungan adalah satu baris data. Misalnya, sumber penggabungan berasal dari salah satu pernyataan select berikut:
-
select <ConstantValues> -
select <Parameters>
Catatan: Skenario ini adalah skenario yang paling mungkin.
-
Sumber penggabungan sebenarnya adalah satu baris data. Misalnya, sumber penggabungan berasal dari salah satu pernyataan select berikut:
-
select <ColumnName> from <TableName> where <TableName>.<ColumnName> = 1Catatan <TableName>.<ColumnName> dikenal oleh pengoptimal kueri sebagai nilai yang unik.
-
select top 1 <ColumnName> from <TableName>
-
Gabungan antara sumber penggabungan dan target penggabungan memiliki predikat yang menjamin bahwa satu baris akan diperbarui.
Klausa pembaruan mengatur kolom Column1 ke nilai konstan, terlepas dari sumber penggabungannya.
Opsi Kaskade Saat Pembaruan tidak diaktifkan pada batasan kunci asing di Table2.
Catatan: Kami menyarankan Anda menerapkan hotfix ini jika menggunakan pernyataan MERGE untuk memperbarui kolom yang memiliki indeks unik non-kluster yang direferensikan oleh batasan kunci asing.
Resolusi
Perbaikan untuk masalah ini pertama kali dirilis dalam Pembaruan Kumulatif 1. Untuk informasi selengkapnya tentang cara mendapatkan paket pembaruan kumulatif ini untuk SQL Server 2008, klik nomor artikel berikut untuk melihat artikel di Pangkalan Pengetahuan Microsoft:
956717 Paket pembaruan kumulatif 1 untuk SQL Server 2008
Catatan Karena build bersifat kumulatif, setiap rilis perbaikan baru berisi semua hotfix dan semua perbaikan keamanan yang disertakan dengan rilis perbaikan SQL Server 2008 sebelumnya. Kami menyarankan Anda mempertimbangkan untuk menerapkan rilis perbaikan terbaru yang berisi hotfix ini. Untuk informasi selengkapnya, klik nomor artikel berikut untuk melihat artikel di Pangkalan Pengetahuan Microsoft:
956909 Build SQL Server 2008 yang dirilis setelah SQL Server 2008 dirilis
Solusi
Paket hotfix menghilangkan masalah. Jika Anda menggunakan pernyataan MERGE dalam skenario yang dijelaskan di bagian "Gejala" dan memilih untuk tidak menerapkan hotfix, ikuti langkah-langkah berikut untuk mengatasi masalah ini:
Tulis ulang pernyataan MERGE sehingga nilai untuk sumber gabungan berada dalam tabel, tabel sementara, atau variabel tabel, bukan sebaris dalam kueri.
Gunakan bendera pelacakan 8790. Bendera pelacakan ini memaksa pengoptimal untuk menggunakan jenis rencana yang disebut rencana pembaruan luas. Rencana pembaruan yang luas tidak memiliki masalah. Langkah ini membawa risiko performa untuk semua pernyataan DML. Oleh karena itu, Anda harus menghindari menggunakan langkah ini kecuali tidak mungkin untuk mengubah aplikasi.
Skrip Transact-SQL berikut menunjukkan salah satu cara mengubah skrip Anda guna mengatasi masalah ini jika Anda tidak dapat menerapkan hotfix ini.
Misalnya, Anda memiliki skrip yang menyerupai seperti berikut ini:
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);
Ubah skrip agar menyerupai seperti berikut ini:
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);
Status
Microsoft telah mengonfirmasi bahwa ini adalah masalah dalam produk Microsoft sebagaimana tercantum di bagian "Berlaku untuk".
Informasi Selengkapnya
Untuk informasi selengkapnya tentang file yang diubah, dan untuk informasi tentang prasyarat apa pun untuk menerapkan paket pembaruan kumulatif yang berisi hotfix yang dijelaskan dalam artikel Pangkalan Pengetahuan Microsoft ini, klik nomor artikel berikut untuk melihat artikel di Pangkalan Pengetahuan Microsoft:
956717 Paket pembaruan kumulatif 1 untuk SQL Server 2008
Referensi
Untuk informasi selengkapnya tentang daftar build yang tersedia setelah rilis SQL Server 2008, klik nomor artikel berikut untuk melihat artikel di Pangkalan Pengetahuan Microsoft:
956909 Build SQL Server 2008 yang dirilis setelah SQL Server 2008 dirilis
Untuk informasi selengkapnya tentang Model Pelayanan Tambahan untuk SQL Server, klik nomor artikel berikut untuk melihat artikel di Pangkalan Pengetahuan Microsoft:
935897 Model Pelayanan Tambahan tersedia dari tim SQL Server untuk memberikan perbaikan atas masalah yang dilaporkan
Untuk informasi selengkapnya tentang skema penamaan untuk pembaruan SQL Server, klik nomor artikel berikut untuk melihat artikel di Pangkalan Pengetahuan Microsoft:
822499 Skema penamaan baru untuk paket pembaruan perangkat lunak Microsoft SQL Server
Untuk informasi selengkapnya tentang terminologi pembaruan perangkat lunak, klik nomor artikel berikut untuk melihat artikel di Pangkalan Pengetahuan Microsoft:
824684 Deskripsi terminologi standar yang digunakan untuk menjelaskan pembaruan perangkat lunak Microsoft
Indeks tidak berkluster di SQL Server 2008
Untuk informasi selengkapnya tentang indeks tidak berkluster di SQL Server 2008, kunjungi Situs web Jaringan Pengembang Microsoft (MSDN) berikut: