FIX: 한 MERGE 문이 있습니다 없습니다 적용하는 외래 키 제약 조건을 때 문을 클러스터링 키 포함되지 않은 고유 키 열 업데이트 단일 행을 업데이트 원본으로 SQL Server 2008의

기술 자료 번역 기술 자료 번역
기술 자료: 956718 - 이 문서가 적용되는 제품 보기.
# 버그: 50003167 SQL 핫픽스
SQL 릴리스된 후에 릴리스된 빌드의 마스터 목록에 대한 자세한 문서를 보려면 Microsoft 기술 자료에 있는 다음 문서 번호를 클릭하십시오.
957826SQL Server 2008 이후에 릴리스된 빌드 SQL Server 2008에 [NULL]에 대한 자세한 정보를 찾을 수 및 SQL Server 2005 서비스 팩 2 이후에 발표된 SQL Server 2005 빌드
모두 확대 | 모두 축소

현상

Microsoft SQL Server 2008의 외래 키 제약 조건 수 적용할 수 없습니다 다음 조건에 해당하는 경우:
  • MERGE 문이 발급됩니다.
  • 업데이트 대상 열의 클러스터되지 않은 고유 인덱스가.
영문자와 숫자가 조합된 PIN 코드가 설정된 Bluetooth 장치가 있다면. 문을 Table1 테이블의 Column1 이름이 고유한 열을 업데이트합니다. Table1Table2 이름이 있는 테이블의 외래 키 제약 조건이 참조됩니다.

결과는 Table1 행을 사용자가 이미 합니다 없을 때 변경되는입니다. 또한, Table2Table1 현수 참조 행 합니다.

이 문제는 다음 조건에 해당하는 경우 이 시나리오에서 발생합니다.
  • Table1 참조된 Column1 열에 Table1 클러스터링 키의 일부가 아닙니다.
  • 가능한 값은 하나만 Column1 열에 할당할 수 있습니다. 예를 들어, 다음 시나리오 중 하나가 발생합니다.
    • 병합 원본 데이터의 단일 행입니다. 예를 들어, 다음 SELECT 문을 중 하나에서 다음과 병합 원본에 같습니다.
      • select <ConstantValues>
      • select <Parameters>
      참고 이 시나리오는 대부분 시나리오입니다.
    • 병합 원본이 데이터의 단일 행을 실제로입니다. 예를 들어, 다음 SELECT 문을 중 하나에서 다음과 병합 원본에 같습니다.
      • select <ColumnName> from <TableName> where <TableName>.<ColumnName> = 1
        참고 <TableName>. <ColumnName> 값은 고유해야 쿼리 최적화 프로그램에서 알려져 있습니다.
      • select top 1 <ColumnName> from <TableName>
    • 병합 원본 및 병합 대상 간의 조인을 단일 행이 업데이트되도록 보장하는 조건자가 있습니다.
    • 업데이트 절의 Column1 열을 병합 소스에 관계없이 상수 값으로 설정합니다.
  • 업데이트 모두 옵션은 Table2 외래 키 제약 해제되어 있습니다.
참고 MERGE 문을 사용하여 외래 키 제약 조건에서 참조하는 클러스터되지 않은 고유 인덱스가 없는 열을 업데이트하는 이 핫픽스를 적용하는 것이 좋습니다.

해결 방법

이 문제점에 대한 픽스는 누적 업데이트 1 먼저 릴리스되었습니다. SQL Server 2008이 누적 업데이트 패키지를 구하는 방법에 대한 자세한 문서를 보려면 Microsoft 기술 자료에 있는 다음 문서 번호를 클릭하십시오.
956717SQL Server 2008의 누적 업데이트 패키지 1
참고 빌드가 누적되는 형태이므로 새로운 각 수정 릴리스의 모든 핫픽스를 포함하며 수정 프로그램 릴리스의 이전 SQL Server 2008에 포함된 모든 보안 수정. 이 핫픽스가 포함된 최신 수정 릴리스를 적용하는 고려하는 것이 좋습니다. 추가 정보는 다음 문서 번호를 클릭하여 Microsoft 기술 자료에서 확인하십시오:
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);

현재 상태

Microsoft는 "본 문서의 정보는 다음의 제품에 적용됩니다." 절에 나열된 Microsoft 제품에서 이 문제를 확인했습니다.

추가 정보

어떤 파일은 변경되지에 대한 자세한 내용과 이 Microsoft 기술 자료 문서에 설명되어 있는 핫픽스가 포함된 누적 업데이트 패키지를 적용하려면 전제 조건에 대한 자세한 내용은 Microsoft 기술 자료에 있는 문서를 보려면 다음 문서 번호를 자료의.
956717SQL Server 2008의 누적 업데이트 패키지 1

참조

SQL Server 2008 릴리스 후에 사용할 수 있는 빌드 목록에 대한 자세한 문서를 보려면 Microsoft 기술 자료에 있는 다음 문서 번호를 클릭하십시오.
956909SQL Server 2008 SQL Server 2008 릴리스된 후에 릴리스된 빌드


SQL Server에 [NULL]에 대한 증분 서비스 모델에 대한 자세한 문서를 보려면 Microsoft 기술 자료에 있는 다음 문서 번호를 클릭하십시오.
935897보고된 문제에 대한 핫픽스를 제공하는 SQL Server 팀으로부터 증분 서비스 모델을 구할 수


SQL Server 업데이트 명명 스키마에 대한 자세한 문서를 보려면 Microsoft 기술 자료에 있는 다음 문서 번호를 클릭하십시오.
822499Microsoft SQL Server 소프트웨어 업데이트 패키지의 새로운 명명 스키마


소프트웨어 업데이트 용어에 대한 자세한 문서를 보려면 Microsoft 기술 자료에 있는 다음 문서 번호를 클릭하십시오.
824684Microsoft 소프트웨어 업데이트를 설명하는 데 사용되는 표준 용어에 대한 설명

참조

자세한 내용은 SQL Server 2008의 클러스터되지 않은 인덱스를 내용을 보려면 다음 MSDN Microsoft 개발자 네트워크 웹 사이트를 방문하십시오.
http://msdn.microsoft.com/en-us/library/ms179325(SQL.100).aspx

속성

기술 자료: 956718 - 마지막 검토: 2008년 9월 19일 금요일 - 수정: 4.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
키워드:?
kbmt kbautohotfix kbhotfixserver kbqfe kbpubtypekc kbfix KB956718 KbMtko
기계 번역된 문서
중요: 본 문서는 전문 번역가가 번역한 것이 아니라 Microsoft 기계 번역 소프트웨어로 번역한 것입니다. Microsoft는 번역가가 번역한 문서 및 기계 번역된 문서를 모두 제공하므로 Microsoft 기술 자료에 있는 모든 문서를 한글로 접할 수 있습니다. 그러나 기계 번역 문서가 항상 완벽한 것은 아닙니다. 따라서 기계 번역 문서에는 마치 외국인이 한국어로 말할 때 실수를 하는 것처럼 어휘, 구문 또는 문법에 오류가 있을 수 있습니다. Microsoft는 내용상의 오역 또는 Microsoft 고객이 이러한 오역을 사용함으로써 발생하는 부 정확성, 오류 또는 손해에 대해 책임을 지지 않습니다. Microsoft는 이러한 문제를 해결하기 위해 기계 번역 소프트웨어를 자주 업데이트하고 있습니다.

피드백 보내기

 

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