Sintomi

Si supponga che si tenta di eliminare dati da una tabella e i dati viene fatto riferimento in altre tabelle in Microsoft SQL Server 2016 e 2017. If esplori query piano di esecuzione, è possibile vederlo utilizza un operatore di riferimento di chiave esterna controlla .In questo caso, venga visualizzato un messaggio di errore anche se la riga in corso eliminato non viene fatto riferimento in altre tabelle:

Msg 547, livello 16, stato 0, riga LineNumber

L'istruzione DELETE in conflitto con il vincolo di riferimento

Stato

Microsoft ha confermato che questo problema si verifica nei prodotti elencati nella sezione "Si applica a".

Risoluzione

Questo problema viene risolto nell'aggiornamento cumulativo per SQL Server seguente:

Nota: Questo problema viene risolto in 6 aggiornamento cumulativo per SQL Server 2016 SP2.

Informazioni sugli aggiornamenti cumulativi per SQL Server:

Ogni nuovo aggiornamento cumulativo per SQL Server contiene tutti gli hotfix e tutte le correzioni di protezione che sono state incluse nell'aggiornamento cumulativo precedente. Estrarre gli ultimi aggiornamenti cumulativi per SQL Server:

Soluzione alternativa

Per ovviare a questo problema, utilizzare uno dei seguenti metodi:

  • Utilizzare il livello di compatibilità inferiore a 130 per eseguire la query.

  • Modificare la struttura dell'indice nella tabella di riferimento.

Ulteriori informazioni

Avvio del database nell'ambito a livello di compatibilità di configurazione 130 in SQL Server 2016, un piano di esecuzione può utilizzare il riferimento di chiave esterna Operatore di controllo per verificare se una riga in una tabella fa riferimento a tutte le righe in altri tabelle mediante vincoli di integrità referenziale. Tale operatore può essere utilizzato se riferimento a una tabella da un numero elevato di tabelle esterne. In questo operatore, SQL Server sceglie un indice in ogni tabella di riferimento per eseguire tale controllo. Se una tabella di riferimento ha un indice con più colonne chiave, ad alcuni colonne all'inizio non fanno parte della chiave esterna, ma un'altra le colonne fanno parte della chiave esterna. Ciò non corretto controllo eseguito da SQL Server.

Ad esempio, si consideri il seguente schema:

creare una tabella tpk (pk int vincolo cpk di chiave primaria cluster)

creare una tabella tfk (int, int fk vincolo cfk riferimenti di chiave esterna tpk, clustered(a,fk)) ia indice

Tale schema può provocare questo problema, ma se si modifica ordine delle colonne nell'indice ia a (fk, un), non sarà.

Riferimenti

Informazioni di  terminologiautilizzato da Microsoft per descrivere gli aggiornamenti software.

Serve aiuto?

Vuoi altre opzioni?

Esplorare i vantaggi dell'abbonamento e i corsi di formazione, scoprire come proteggere il dispositivo e molto altro ancora.

Le community aiutano a porre e a rispondere alle domande, a fornire feedback e ad ascoltare gli esperti con approfondite conoscenze.