sql >> Base de Datos >  >> RDS >> Sqlserver

Cómo habilitar una restricción CHECK en SQL Server (ejemplo de T-SQL)

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.