2012-08-31 5 views
15

Ich habe einen SQL Server 2012 db mit einem Fremdschlüssel, die Countries.CountryID = States.CountryID verweistSQL NO CHECK FOREIGN KEY nach Daten, die erneute Aktivierung Abfrageoptimierer

I Countries Tabelle neu erstellen benötigt, so lasse ich diesen Fremdschlüssel von den States Tabelle (sonst wäre es mir nicht erlauben, Länder DROP)

Nachdem ich das tun, ich möchte den FK auf States neu erstellen, aber es erlaubt mir nicht zu, es sei denn ich NO CHECK als solche angegeben werden:

ALTER TABLE States 
    WITH NOCHECK 
    ADD CONSTRAINT FK_StatesCountries FOREIGN KEY (CountryID) REFERENCES Countries(CountryID) 
GO 

Ich habe zuerst nicht bemerkt, dass einige der Reihen von Staaten CountryID hatten, die keinen passenden Countries.CountryID Rekord hatten. Offensichtlich erlaubte mir WITH NOCHECK, ohne Fehler fortzufahren.

Jetzt SQLServer mit dieser FK als "nicht vertrauenswürdig" markieren, MSDN sagt, Abfrage-Optimierer wieder zu aktivieren, indem Sie alle Einschränkungen überprüfen. Warum gibt mir die folgende Zeile KEINE Fehlermeldung, obwohl einige Länder eine ungültige CountryID haben?

ALTER TABLE States 
     CHECK CONSTRAINT ALL 
GO 

Ich würde denken, das sollte einen Fehler ausgelöst haben.

Antwort

17

Um die Einschränkungen wieder vertrauenswürdig zu machen, müssten Sie diese Syntax verwenden, die zugegebenermaßen etwas seltsam aussieht. Das WITH CHECK verursacht die Überprüfung vorhandener Daten.

ALTER TABLE States 
     WITH CHECK CHECK CONSTRAINT ALL 
GO 

Wie zuvor wird dies einen Fehler auslösen, bis Sie die Zustände mit schlechten CountryID-Werten aufgelöst haben.

+0

Perfekt, danke! wird die Antwort in 9 Minuten markieren – parliament