Исправление: Оператор MERGE может не обеспечить ограничение внешнего ключа при инструкции обновления уникального ключевого столбца, который не входит в ключ кластеризации и одну строку как источник обновления в SQL Server 2008

Переводы статьи Переводы статьи
Код статьи: 956718 - Vizualiza?i produsele pentru care se aplic? acest articol.
Ошибка #: 50003167 (исправление SQL)
Для получения дополнительных сведений о главном списке построений, которые были выпущены после выхода SQL щелкните следующий номер статьи базы знаний Майкрософт:
957826Где можно найти дополнительные сведения о SQL Server 2008 построений, выпущенные после SQL Server 2008 и SQL Server 2005 собирает, выпущенные после пакета обновления 2 для SQL Server 2005
Развернуть все | Свернуть все

Проблема

Ограничение внешнего ключа в Microsoft SQL Server 2008, не применяются в при следующих условиях:
  • Выдает инструкцию MERGE.
  • Обновления целевой столбец содержит уникальный некластеризованный индекс.
Рассмотрим описанную ниже ситуацию.. Инструкция обновления уникального столбца с именемСтолбец1таблицы с именемТаблица1.Таблица1ссылается ограничение внешнего ключа в таблице с именемТаблица2.

В результате получается, строк вТаблица1При их следует не изменяются. Кроме того,Таблица2будет иметь строки, имеющие висячий ссылкиТаблица1.

Такая проблема возникает в этом сценарии выполняются следующие условия:
  • На которую указывает ссылкаСтолбец1в столбцеТаблица1не является частью ключа кластеризацииТаблица1.
  • Может быть присвоено только одно возможное значениеСтолбец1столбец. Например один из следующих сценариев происходит:
    • Источник является одной строки данных. Например источник является одним из следующих инструкций select:
      • select <ConstantValues>
      • select <Parameters>
      Примечание.Эта ситуация наиболее вероятна ситуация.
    • Источник является фактически одной строки данных. Например источник является одним из следующих инструкций select:
      • select <ColumnName> from <TableName> where <TableName>.<ColumnName> = 1
        Примечание.<tablename></tablename>.<columnname></columnname>называется оптимизатором запросов для уникального значения.
      • select top 1 <ColumnName> from <TableName>
    • Соединение источника слияния и объединения целевой имеет в предикате, гарантирует обновить одну строку.
    • Задает предложение обновленияСтолбец1столбец с постоянным значением, независимо от источника слияния.
  • надписьюНа каскадное обновлениепараметр не включен на ограничение внешнего ключа вТаблица2.
Примечание.Корпорация Майкрософт рекомендует применить данное исправление при использовании оператора MERGE обновить столбцы, которые имеют уникальные некластеризованные индексы, на которые ссылается ограничение внешнего ключа.

Решение

Исправление, устраняющее эту проблему, сначала было выпущено в накопительное обновление 1.Для получения дополнительных сведений о том, как получить этот накопительный пакет обновления для SQL Server 2008 щелкните следующий номер статьи базы знаний Майкрософт:
956717Накопительный пакет обновления 1 для SQL Server 2008
Примечание.Поскольку сборки являются накопительными, каждый новый выпуск исправление содержит все исправления, и все исправления, входившие в состав предыдущих SQL Server 2008 исправление выпуска. Рекомендуется, чтобы учесть применение последний выпуск исправления, содержащего это исправление.Для получения дополнительных сведений обратитесь к следующей статье Базы Знаний Майкрософт::
956909SQL Server 2008 построений, которые были выпущены после выхода SQL Server 2008

Временное решение

Пакет исправлений устраняет проблему. Если оператор MERGE можно использовать в сценарии, описанные в разделе «Проблема» и не будет установить исправление, выполните следующие действия для устранения этой проблемы.
  1. Перепишите инструкцию MERGE, таким образом, чтобы значения для источника слияния, в таблице, во временную таблицу или табличную переменную вместо того, в линией в запросе.
  2. С помощью флага трассировки 8790. Этот флаг трассировки заставляет оптимизатор использовать тип плана, который называется шириной обновление плана. Планы широкого обновления не проблема. На этом шаге несет угрозу производительность для всех инструкций DML. Таким образом следует использовать этот шаг, если это невозможно изменить приложение.
Следующий сценарий Transact-SQL демонстрирует один способ изменить сценарий для решения этой проблемы, если нельзя применить данное исправление.

Например у вас есть сценарий, подобное приведенному ниже:
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);
Измените сценарий, как показано ниже:
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);

Статус

Корпорация Майкрософт подтверждает, что это проблема в продуктах Майкрософт, перечисленных в разделе «Применяется к»..

Дополнительная информация

Для получения дополнительных сведений об изменении файлов, а также сведения о требованиях для применения накопительного обновления для пакета, который содержит данное исправление, описанное в данной статье базы знаний Майкрософт щелкните следующий номер статьи базы знаний Майкрософт:
956717Накопительный пакет обновления 1 для SQL Server 2008

Ссылки

Для получения дополнительных сведений о списке сборок, доступных после выпуска SQL Server 2008 щелкните следующий номер статьи базы знаний Майкрософт:
956909SQL Server 2008 построений, которые были выпущены после выхода SQL Server 2008


Для получения дополнительных сведений о последовательный модели обслуживания для SQL Server щелкните следующий номер статьи базы знаний Майкрософт:
935897Последовательный модели обслуживания доступна группа разработчиков SQL Server для предоставления исправления для устранения неполадок


Для получения дополнительных сведений о схеме именования для обновления SQL Server щелкните следующий номер статьи базы знаний Майкрософт:
822499Новая схема присвоения имен пакетам обновлений программного обеспечения Microsoft SQL Server


Дополнительные сведения о терминах, используемых при описании обновлений программного обеспечения, см. в следующей статье базы знаний Майкрософт::
824684Стандартные термины, используемые при описании обновлений программных продуктов Майкрософт

Ссылки

Для получения дополнительных сведений о некластеризованных индексов в SQL Server 2008 посетите следующий веб-узел Microsoft Developer Network (MSDN):
.aspx HTTP://MSDN.Microsoft.com/en-us/library/ms179325 (SQL.100)

Свойства

Код статьи: 956718 - Последний отзыв: 29 ноября 2010 г. - Revision: 2.0
Информация в данной статье относится к следующим продуктам.
  • Microsoft SQL Server 2008 Enterprise
  • Microsoft SQL Server 2008 Developer
  • Microsoft SQL Server 2008 Standard
  • Microsoft SQL Server 2008 Standard Edition for Small Business
  • Microsoft SQL Server 2008 Web
  • Microsoft SQL Server 2008 Workgroup
  • Microsoft SQL Server 2008 Express
  • Microsoft SQL Server 2008 Express with Advanced Services
Ключевые слова: 
kbautohotfix kbqfe kbPubTypeKC kbfix kbmt KB956718 KbMtru
Переведено с помощью машинного перевода
ВНИМАНИЕ! Перевод данной статьи был выполнен не человеком, а с помощью программы машинного перевода, разработанной корпорацией Майкрософт. Корпорация Майкрософт предлагает вам статьи, переведенные как людьми, так и средствами машинного перевода, чтобы у вас была возможность ознакомиться со статьями базы знаний KB на родном языке. Однако машинный перевод не всегда идеален. Он может содержать смысловые, синтаксические и грамматические ошибки, подобно тому как иностранец делает ошибки, пытаясь говорить на вашем языке. Корпорация Майкрософт не несет ответственности за неточности, ошибки и возможный ущерб, причиненный в результате неправильного перевода или его использования. Корпорация Майкрософт также часто обновляет средства машинного перевода.
Эта статья на английском языке:956718

Отправить отзыв

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com