2012-08-31 22 views
15

tengo una 2012 db SQL Server con una restricción de clave externa que hace referencia Countries.CountryID = States.CountryIDSQL NO CLAVE Cheque internacional después de los datos, volver a habilitar optimizador de consultas de

que necesitaba para volver a crear Countries mesa, así que caer esta clave externa de la States mesa (de lo contrario no permitiría que lo deje países)

Después de hacer eso, quiero volver a crear el FK en States pero no me permito a menos que yo indique NO CHECK como tal:

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

No me di cuenta al principio que algunas de las filas de estados tenían CountryID que no tenían un registro Countries.CountryID coincidente. Obviamente, WITH NOCHECK me permitió proceder sin error.

Ahora SQLServer con marca este FK como "no confiable", MSDN dice que vuelva a habilitar el optimizador de consultas comprobando todas las restricciones. Entonces, ¿por qué la siguiente línea NO me da un error a pesar de que algunos estados tienen un CountryID no válido?

ALTER TABLE States 
     CHECK CONSTRAINT ALL 
GO 

Creo que esto debería haber provocado un error.

Respuesta

17

Para volver a confiar en las restricciones, necesitaría usar esta sintaxis, que ciertamente parece un poco extraña. El WITH CHECK es lo que causa la validación de los datos existentes.

ALTER TABLE States 
     WITH CHECK CHECK CONSTRAINT ALL 
GO 

Como antes, esto arrojará un error hasta que resuelva los Estados con valores de CountryID incorrectos.

+0

Perfecto, gracias! marcará la respuesta en 9 minutos – parliament

Cuestiones relacionadas