VINCERE IL CONTROLLORE DI CONTROLLO DELLA TABELLA


25

Da Esplora oggetti in SQL Server, durante la selezione e lo scripting di un vincolo di chiave esterna, viene generato il seguente codice.

     USE [MyTestDatabase]
     GO

     ALTER TABLE [dbo].[T2] WITH NOCHECK ADD CONSTRAINT [FK_T2_T1] FOREIGN KEY([T1ID])
     REFERENCES [dbo].[T1] ([T1ID])
     GO

     ALTER TABLE [dbo].[T2] CHECK CONSTRAINT [FK_T2_T1]
     GO

Qual è lo scopo dell'ultima frase "ALTER TABLE CHECK CONSTRAINT"? Non sembra importare se viene eseguito o meno. Non fallisce sui dati errati esistenti, né cambia il fatto che il vincolo verrà applicato ai nuovi dati.

Grazie!

Risposte:


23

Assicura che il vincolo sia abilitato dopo la sua creazione. La tua ALTER TABLEdichiarazione include WITH NOCHECKqual è il pezzo che dice di non verificare la presenza di dati errati esistenti durante la creazione del vincolo.

Come scritto, i dati esistenti non verranno verificati rispetto al vincolo a causa della WITH NOCHECKprima dichiarazione. L'emissione della seconda istruzione consentirà il controllo rispetto al vincolo per eventuali future modifiche alla tabella coperte dal vincolo, fino al punto in cui ALTER TABLE [dbo].[T2] NOCHECK CONSTRAINT [FK_T2_T1]viene emesso un.

Le dichiarazioni, come scritto, stanno sostanzialmente dicendo "Crea questo vincolo di chiave esterna ma non verificarlo rispetto ai dati esistenti. Renderlo attivo per eventuali modifiche imminenti ai dati."


In realtà l'ho verificato, non fa differenza se ci sono dati errati, la prima o la seconda riga non falliranno. Per fallire, dovrebbero apparire così:
Delux,

2
ALTER TABLE [dbo]. [T2] CON VINCOLO CONTROLLARE CONTROLLO [FK_T2_T1]
Delux,

Destra. Ma vedrai che fallirà dopo che quando ad un certo punto provi a eseguire un INSERT o un UPDATE che viola il vincolo. Né fallirà se esistono dati errati nel momento in cui vengono eseguite quelle 2 istruzioni.
Squillman,

7

La tua prima affermazione crea un vincolo disabilitato. Deve essere abilitato e probabilmente attendibile. La strana sintassi seguente assicurerà che il tuo vincolo sia abilitato e attendibile:

ALTER TABLE YourTable
      WITH CHECK CHECK CONSTRAINT YourConstraint;

C'è un ottimo post sul blog di Hugo Kornelis che lo spiega in dettaglio: puoi fidarti dei tuoi vincoli

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.