Si tienes un CHECK
restricción en SQL Server que actualmente está deshabilitada, puede usar el código a continuación para volver a habilitarla.
Cuando habilitas un CHECK
restricción (o una restricción de clave externa para el caso), tiene la opción de especificar si desea verificar o no los datos existentes en la tabla.
A continuación se muestran ejemplos de código para habilitar un CHECK
restricción, especificando cada una de estas diferentes opciones.
Ejemplo 1:habilite una restricción con WITH CHECK
Este es el método recomendado para habilitar su CHECK
restricciones (a menos que tenga una razón específica para no usarlo).
Aquí hay un ejemplo de cómo habilitar una restricción llamada chkJobTitle
:
ALTER TABLE Occupation WITH CHECK CHECK CONSTRAINT chkJobTitle;
Aquí declaro explícitamente WITH CHECK
, que le dice a SQL Server que verifique los datos existentes antes de habilitar la restricción. Si algún dato viola la restricción, la restricción no se habilitará y obtendrá un error.
Esto es bueno, porque refuerza la integridad de los datos.
Cuando creas un nuevo CHECK
restricción, esta es la configuración predeterminada. Sin embargo, cuando habilita una restricción existente (como lo estamos haciendo aquí), no la configuración predeterminada.
Ejemplo 2:habilitar una restricción con WITH NOCHECK
En este ejemplo, la restricción se habilita sin verificar los datos existentes:
ALTER TABLE Occupation WITH NOCHECK CHECK CONSTRAINT chkJobTitle;
Aquí declaro explícitamente WITH NOCHECK
, que le dice a SQL Server que no verifique los datos existentes. Esto significa que la restricción se habilitará incluso si la tabla ya contiene datos que violan la restricción.
Esta es la configuración predeterminada cuando se habilita una restricción (pero no cuando se crea una).
Una de las pocas razones (probablemente la única razón) por la que usaría esto es si desea mantener datos no válidos en la base de datos. Tal vez tenga una excepción única en la que debe ingresar una fila o más de datos no válidos, pero requiere que todos los datos futuros se ajusten a la restricción.
Sin embargo, todavía hay riesgos asociados con hacer esto. Esto es lo que Microsoft tiene que decir al respecto:
No recomendamos hacer esto, excepto en casos excepcionales. La nueva restricción se evalúa en todas las actualizaciones de datos posteriores. Cualquier infracción de restricción suprimida por WITH NOCHECK
cuando se agrega la restricción, es posible que las actualizaciones futuras fallen si actualizan las filas con datos que no siguen la restricción.
Entonces usando WITH NOCHECK
podría causar problemas más adelante.
Ejemplo 3:habilitar una restricción con la opción predeterminada
Aquí hay un ejemplo usando la opción predeterminada:
ALTER TABLE Occupation CHECK CONSTRAINT chkJobTitle;
Este ejemplo es el equivalente del ejemplo anterior. Debido a que no especifiqué si verificar o no, SQL Server asume que quiero WITH NOCHECK
.
Usar WITH NOCHECK elimina la confianza
Cuando habilita una restricción usando WITH NOCHECK
, una consecuencia que debe tener en cuenta es que SQL Server ya no confía en esa restricción. Lo marca como no confiable.
Sí, lo leiste bien. De hecho, hay un is_not_trusted
marca que SQL Server establece en 1
cuando deshabilitas un CHECK
restricción (lo que significa que no es de confianza), y la única forma de establecerlo en 0
(de confianza) es especificar WITH CHECK
al volver a habilitar la restricción. Usando WITH NOCHECK
simplemente no es suficiente.
Esto tiene perfecto sentido. Después de todo, usted confiar en una restricción que no ha comprobado todos los datos?
Usando WITH CHECK
, se asegura de que la restricción verifique todos los datos existentes antes de habilitarse. La única forma en que se puede habilitar es si todos los datos existentes se ajustan a la restricción. Una vez que haya verificado todos los datos existentes, se puede confiar en él.
Para obtener más información sobre esto, consulte Lo que debe saber acerca de WITH NOCHECK al habilitar una restricción CHECK en SQL Server, donde puede ver el is_not_trusted
real. la bandera se alterna cada vez que deshabilito y vuelvo a habilitar un CHECK
restricción.