Al momento sei offline in attesa che la connessione Internet venga ristabilita

Il tuo browser non è supportato

Devi aggiornare il browser per usare il sito.

Esegui l'aggiornamento all'ultima versione di Internet Explorer

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

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
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
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 productusing (select 'Office Chair2' as name, 1 as pno, 'oxx' as pAlternateKey) as srcon product.pno = src.pnowhen matched then   update set product.pAlternateKey = src.pAlternateKey,               product.name = src.namewhen 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 productusing @source as srcon product.pno = src.pnowhen matched then   update set product.pAlternateKey = src.pAlternateKey,               product.name = src.namewhen 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):
"Installazione di SQL Server 2008" "Configurazione di SQL Server 2008"

Avviso: questo articolo è stato tradotto automaticamente

Proprietà

ID articolo: 956718 - Ultima revisione: 09/19/2008 20:41:00 - Revisione: 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 KbMtit
Feedback
://c1.microsoft.com/c.gif?"> >ow.location.protocol) + "//c.microsoft.com/ms.js'><\/script>");