2012-04-02 19 views
20

Si guión que una tabla con una clave externa, que se ve así:ALTER TABLE [dbo] [MyTable] restricción CHECK [FK_MyTable_SomeCol]

GO 
ALTER TABLE [dbo].[MyTable] WITH CHECK ADD CONSTRAINT [FK_MyTable_SomeCol] FOREIGN KEY([SomeCol]) 
REFERENCES [dbo].[MyOtherTable] ([SomeCol]) 
GO 
ALTER TABLE [dbo].[MyTable] CHECK CONSTRAINT [FK_MyTable_SomeCol] 
GO 

¿Cuál es la segunda parte de (ALTER TABLE [dbo].[MyTable] CHECK CONSTRAINT [FK_MyTable_SomeCol])?

+0

No veo la segunda declaración cuando script una tabla con una clave externa (SQL Server 2008 R2). ¿Estás seguro de que el primero no contiene ** 'WITH NOCHECK' ** en lugar de' WITH CHECK'? –

+0

Sí, es CON NOCHECK. Ahora su funcionalidad es más clara para mí. ¡Gracias a todos! – yonexbat

Respuesta

19

Es un artefacto de la forma en que se crea la restricción, aunque no es necesario especificar estas opciones (ya que son las predeterminadas para nuevas restricciones), el mismo generador también puede generar opciones NOCHECK exactamente de la misma manera.

Documentation para ALTER TABLE indica dos usos distintos de CHECK/NOCHECK:

WITH CHECK | WITH NOCHECK

Especifica si los datos en la tabla es o no se valida contra un recién agregado o se vuelva a habilitar FOREIGN KEY o CHECK restricción. Si no se especifica, se supone WITH CHECK para las nuevas restricciones, y se supone WITH NOCHECK para las restricciones reactivadas.

Y:

{ CHECK | NOCHECK } CONSTRAINT

Especifica que constraint_name está activado o desactivado.

Así que una opción es decir "verificar el contenido actual de la tabla", la otra es decir "Validar nuevos datos a medida que se agrega".

Cuestiones relacionadas