Estoy mirando la base de datos de ejemplo AdventureWorks para SQL Server 2008, y veo en sus scripts de creación que tienden a usar lo siguiente:
ALTER TABLE [Production].[ProductCostHistory] WITH CHECK ADD
CONSTRAINT [FK_ProductCostHistory_Product_ProductID] FOREIGN KEY([ProductID])
REFERENCES [Production].[Product] ([ProductID])
GO
seguido inmediatamente por:
ALTER TABLE [Production].[ProductCostHistory] CHECK CONSTRAINT
[FK_ProductCostHistory_Product_ProductID]
GO
Veo esto para claves foráneas (como aquí), restricciones únicas y CHECK
restricciones regulares ; DEFAULT
las restricciones usan el formato normal con el que estoy más familiarizado, como por ejemplo:
ALTER TABLE [Production].[ProductCostHistory] ADD CONSTRAINT
[DF_ProductCostHistory_ModifiedDate] DEFAULT (getdate()) FOR [ModifiedDate]
GO
¿Cuál es la diferencia, si hay alguna, entre hacerlo de la primera manera versus la segunda?
fuente
ALTER TABLE foo NOCHECK CONSTRAINT fk_b
y luego la vuelve a habilitar,ALTER TABLE foo CHECK CONSTRAINT fk_b
no verificará la restricción.ALTER TABLE foo WITH CHECK CHECK CONSTRAINT fk_b
es necesario para tener los datos verificados.Para demostrar cómo funciona esto ...
fuente
DROP TABLE T2; DROP TABLE T1;
Además de los excelentes comentarios anteriores sobre restricciones confiables:
Una restricción no confiable, como su nombre lo indica, no se puede confiar para representar con precisión el estado de los datos en la tabla en este momento. Sin embargo, se puede confiar para verificar los datos agregados y modificados en el futuro.
Además, el optimizador de consultas no tiene en cuenta las restricciones no confiables.
El código para habilitar restricciones de verificación y restricciones de clave externa es bastante malo, con tres significados de la palabra "verificación".
fuente
WITH NOCHECK
se usa también cuando uno tiene datos existentes en una tabla que no se ajusta a la restricción como se definió y no desea que esté en conflicto con la nueva restricción que está implementando ...fuente
WITH CHECK
es el comportamiento predeterminado, sin embargo, es una buena práctica incluirlo dentro de su codificación.El comportamiento alternativo es, por supuesto
WITH NOCHECK
, utilizar , por lo que es bueno definir explícitamente sus intenciones. Esto se usa a menudo cuando estás jugando con / modificando / cambiando particiones en línea.fuente
Las restricciones de clave externa y verificación tienen el concepto de ser confiables o no confiables, así como de habilitarse y deshabilitarse. Vea la página de MSDN
ALTER TABLE
para más detalles.WITH CHECK
es el valor predeterminado para agregar nuevas claves externas y verificar restricciones,WITH NOCHECK
es el valor predeterminado para volver a habilitar la clave externa deshabilitada y verificar restricciones. Es importante ser consciente de la diferencia.Dicho esto, cualquier declaración aparentemente redundante generada por las empresas de servicios públicos simplemente existe para la seguridad y / o facilidad de codificación. No te preocupes por ellos.
fuente
WITH CHECK CHECK CONSTRAINT
para que confíen en ellas.select * from sys.objects where [type] in ('C', 'F') and (objectproperty([object_id], 'CnstIsDisabled') = 1 or objectproperty([object_id], 'CnstIsNotTrusted') = 1)
para encontrar restricciones deshabilitadas y no confiables. Después de emitir las declaraciones de alterar la tabla apropiadas como se indicó anteriormente, esas restricciones desaparecen de la consulta, por lo que puedo ver que funciona.Aquí hay un código que escribí para ayudarnos a identificar y corregir RESTRICCIONES no confiables en una BASE DE DATOS. Genera el código para solucionar cada problema.
fuente