FIX: Un'istruzione MERGE potrebbe non applicato un vincolo di chiave esterna quando l'istruzione aggiorna una colonna di chiave univoca che non fa parte di una chiave di clustering ed è una singola riga come origine degli aggiornamenti in SQL Server 2008

Traduzione articoli Traduzione articoli
Identificativo articolo: 956718 - Visualizza i prodotti a cui si riferisce l?articolo.
Bug #: 50003167 (SQL Hotfix)
Per ulteriori informazioni sull'elenco master di generazioni rilasciati dopo il rilascio di SQL, fare clic sul numero dell'articolo della Microsoft Knowledge Base riportato di seguito riportato:
957826In cui è possibile trovare ulteriori informazioni su SQL Server 2008 si basa rilasciati dopo SQL Server 2008 e versioni di SQL Server 2005 rilasciate dopo SQL Server 2005 Service Pack 2
Espandi tutto | Chiudi tutto

Sintomi

In Microsoft SQL Server 2008, un vincolo di chiave esterna potrebbe non essere imposta quando sono vere le seguenti condizioni:
  • Un'istruzione di MERGE viene generata.
  • La colonna di destinazione dell'aggiornamento include un indice univoco non cluster.
Si consideri lo scenario seguente. L'istruzione aggiorna una colonna univoca è denominata Column1 di una tabella denominata Table1. Table1 si fa riferimento un vincolo di chiave esterna da una tabella denominata Table2.

Il risultato è che le righe in Table1 vengano modificate quando questi non dovrebbe essere stato. Table2 ha inoltre righe contenenti riferimenti sospeso a Table1.

Questo problema si verifica per questo scenario quando sono vere le seguenti condizioni:
  • La colonna a cui viene fatto riferimento Column1Table1 non fa parte della chiave di clustering della Table1.
  • Un solo valore possibile è possibile assegnare alla colonna Column1. Ad esempio, uno dei seguenti scenari si verifica:
    • L'origine di tipo merge è una singola riga di dati. Ad esempio, l'origine di stampa unione è da una delle seguenti istruzioni selezionare:
      • select <ConstantValues>
      • select <Parameters>
      Nota Questo scenario è lo scenario più probabile.
    • L'origine di tipo merge è effettivamente una singola riga di dati. Ad esempio, l'origine di stampa unione è da una delle seguenti istruzioni selezionare:
      • select <ColumnName> from <TableName> where <TableName>.<ColumnName> = 1
        Nota <TableName>. <ColumnName> è nota da query optimizer per essere un valore univoco.
      • select top 1 <ColumnName> from <TableName>
    • Il join tra l'origine di tipo merge e la destinazione di unione dispone di un predicato che garantisce che una singola riga verrà aggiornata.
    • La clausola di aggiornamento imposta la colonna di Column1 su un valore costante, indipendentemente dall'origine unione.
  • L'opzione On Update Cascade non è attivata il vincolo di chiave esterna in Table2.
Nota Si consiglia di applicare questo aggiornamento rapido (hotfix) se si utilizza l'istruzione MERGE per aggiornare le colonne con indici non cluster univoci a cui fa riferimento i vincoli di chiave esterna.

Risoluzione

La correzione di questo problema è stata rilasciata prima nell'aggiornamento cumulativo 1. Per ulteriori informazioni su come ottenere il pacchetto di aggiornamento cumulativo per SQL Server 2008, fare clic sul numero dell'articolo della Microsoft Knowledge Base riportato di seguito riportato:
956717Pacchetto di aggiornamento cumulativo 1 per SQL Server 2008
Nota Poiché le generazioni sono cumulative, ogni nuova versione di correzione contiene tutti gli aggiornamenti rapidi e tutte le correzioni protezione rilasciate con SQL Server 2008 precedente versione di correggere. Si consiglia di prendere in considerazione applicare la correzione rapida per la versione più recente che contiene questo aggiornamento rapido (hotfix). Per ulteriori informazioni, fare clic sul numero dell'articolo della Microsoft Knowledge Base riportato di seguito riportato:
956909Versioni di SQL Server 2008 rilasciate dopo il rilascio di SQL Server 2008

Workaround

Il pacchetto di hotfix Elimina il problema. Se si utilizza l'istruzione MERGE nello scenario è descritto nella sezione "Sintomi" e se si sceglie di non applicare l'aggiornamento rapido (hotfix), attenersi alla seguente procedura per evitare questo problema:
  1. Riscrivere l'istruzione di MERGE in modo che i valori per l'origine di tipo merge in una tabella, una tabella temporanea o una variabile di tabella anziché essere in-linea nella query.
  2. Utilizzare il flag di traccia 8790. Questo flag di traccia impone a query optimizer per utilizzare un tipo di piano che viene chiamato un piano di aggiornamento di ampia. Piani di aggiornamento larghezza non sono necessario il problema. Questo passaggio esegue i rischi di prestazioni per tutte le istruzioni DML. Di conseguenza, evitare di utilizzare questo passaggio, a meno che non sia Impossibile modificare l'applicazione.
Lo script Transact-SQL riportato di seguito viene illustrato come modificare lo script per risolvere il problema se non è possibile applicare questo aggiornamento rapido (hotfix).

Ad esempio, è necessario uno script analogo al seguente:
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);
modificare lo script in modo che risulti simile al seguente:
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 ha confermato che questo problema riguarda i prodotti sono elencati nella sezione "Si applica a".

Informazioni

Per ulteriori informazioni su quali file vengono modificati e per informazioni sui prerequisiti richiesti per applicare il pacchetto di aggiornamento cumulativo contenente l'hotfix descritto in questo articolo della Microsoft Knowledge Base, fare clic sul numero dell'articolo della Microsoft Knowledge Base riportato di seguito riportato:
956717Pacchetto di aggiornamento cumulativo 1 per SQL Server 2008

Riferimenti

Per ulteriori informazioni sull'elenco delle generazioni disponibili dopo il rilascio di SQL Server 2008, fare clic sul numero dell'articolo della Microsoft Knowledge Base riportato di seguito riportato:
956909Versioni di SQL Server 2008 rilasciate dopo il rilascio di SQL Server 2008


Per ulteriori informazioni sul modello di manutenzione incrementale per SQL Server, fare clic sul numero dell'articolo della Microsoft Knowledge Base riportato di seguito riportato:
935897Un modello di manutenzione incrementale è disponibile dal team di SQL Server per fornire aggiornamenti rapidi per i problemi segnalati


Per ulteriori informazioni sullo schema di denominazione degli aggiornamenti di SQL Server, fare clic sul numero dell'articolo della Microsoft Knowledge Base riportato di seguito riportato:
822499Nuovo schema di denominazione per i pacchetti di aggiornamento software di Microsoft SQL Server


Per ulteriori informazioni sulla terminologia di aggiornamento software, fare clic sul numero dell'articolo della Microsoft Knowledge Base riportato di seguito riportato:
824684Descrizione della terminologia standard utilizzata per descrivere gli aggiornamenti software Microsoft

Riferimenti

Per ulteriori informazioni sugli indici non cluster in SQL Server 2008, visitare il seguente sito Web MSDN (informazioni in lingua inglese):
http://msdn.microsoft.com/en-us/library/ms179325(SQL.100).aspx

Proprietà

Identificativo articolo: 956718 - Ultima modifica: venerdì 19 settembre 2008 - Revisione: 4.0
Le informazioni in questo articolo si applicano a:
  • 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
Chiavi: 
kbmt kbautohotfix kbhotfixserver kbqfe kbpubtypekc kbfix KB956718 KbMtit
Traduzione automatica articoli
Il presente articolo è stato tradotto tramite il software di traduzione automatica di Microsoft e non da una persona. Microsoft offre sia articoli tradotti da persone fisiche sia articoli tradotti automaticamente da un software, in modo da rendere disponibili tutti gli articoli presenti nella nostra Knowledge Base nella lingua madre dell?utente. Tuttavia, un articolo tradotto in modo automatico non è sempre perfetto. Potrebbe contenere errori di sintassi, di grammatica o di utilizzo dei vocaboli, più o meno allo stesso modo di come una persona straniera potrebbe commettere degli errori parlando una lingua che non è la sua. Microsoft non è responsabile di alcuna imprecisione, errore o danno cagionato da qualsiasi traduzione non corretta dei contenuti o dell?utilizzo degli stessi fatto dai propri clienti. Microsoft, inoltre, aggiorna frequentemente il software di traduzione automatica.
Clicca qui per visualizzare la versione originale in inglese dell?articolo: 956718
LE INFORMAZIONI CONTENUTE NELLA MICROSOFT KNOWLEDGE BASE SONO FORNITE SENZA GARANZIA DI ALCUN TIPO, IMPLICITA OD ESPLICITA, COMPRESA QUELLA RIGUARDO ALLA COMMERCIALIZZAZIONE E/O COMPATIBILITA' IN IMPIEGHI PARTICOLARI. L'UTENTE SI ASSUME L'INTERA RESPONSABILITA' PER L'UTILIZZO DI QUESTE INFORMAZIONI. IN NESSUN CASO MICROSOFT CORPORATION E I SUOI FORNITORI SI RENDONO RESPONSABILI PER DANNI DIRETTI, INDIRETTI O ACCIDENTALI CHE POSSANO PROVOCARE PERDITA DI DENARO O DI DATI, ANCHE SE MICROSOFT O I SUOI FORNITORI FOSSERO STATI AVVISATI. IL DOCUMENTO PUO' ESSERE COPIATO E DISTRIBUITO ALLE SEGUENTI CONDIZIONI: 1) IL TESTO DEVE ESSERE COPIATO INTEGRALMENTE E TUTTE LE PAGINE DEVONO ESSERE INCLUSE. 2) I PROGRAMMI SE PRESENTI, DEVONO ESSERE COPIATI SENZA MODIFICHE, 3) IL DOCUMENTO DEVE ESSERE DISTRIBUITO INTERAMENTE IN OGNI SUA PARTE. 4) IL DOCUMENTO NON PUO' ESSERE DISTRIBUITO A SCOPO DI LUCRO.

Invia suggerimenti

 

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