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

Cómo deshabilitar todas las restricciones de CHECK y clave externa en una base de datos en SQL Server (ejemplos de T-SQL)

Puede usar el siguiente código para deshabilitar todos los CHECK y restricciones de clave externa para la base de datos actual en SQL Server.

EXEC sp_MSforeachtable @command1="ALTER TABLE ? NOCHECK CONSTRAINT ALL"

Esto usa el sp_MSforeachtable no documentado de Microsoft procedimiento almacenado. Este procedimiento le permite realizar tareas en cada tabla de una base de datos. Así que es perfecto para nuestra tarea aquí:deshabilitar todos los CHECK restricciones dentro de la base de datos actual.

A continuación se muestra un ejemplo en el que hago esto y luego compruebo el resultado.

Ejemplo 1:revisar las restricciones

Primero, echaré un vistazo rápido al CHECK actual y restricciones de clave externa en la base de datos, para ver si están habilitadas o deshabilitadas.

SELECT
  OBJECT_NAME(parent_object_id) AS 'Table',
  name AS 'Constraint',
  is_disabled, 
  is_not_trusted
FROM sys.foreign_keys
UNION
SELECT 
  OBJECT_NAME(parent_object_id),
  name,
  is_disabled, 
  is_not_trusted
FROM sys.check_constraints;

Resultado:

+----------------+-----------------+---------------+------------------+
| Table          | Constraint      | is_disabled   | is_not_trusted   |
|----------------+-----------------+---------------+------------------|
| ConstraintTest | chkPrice        | 0             | 0                |
| ConstraintTest | chkValidEndDate | 0             | 0                |
| ConstraintTest | chkTeamSize     | 0             | 0                |
| Occupation     | chkJobTitle     | 0             | 0                |
+----------------+-----------------+---------------+------------------+

Así que actualmente hay cuatro CHECK restricciones en la base de datos, para dos tablas diferentes.

Podemos ver que todas las restricciones están habilitadas porque is_disabled se establece en 0 .

Ejemplo 2:deshabilitar las restricciones

Ahora deshabilitaré todas las restricciones:

EXEC sp_MSforeachtable @command1="ALTER TABLE ? NOCHECK CONSTRAINT ALL"

Por lo general, es una buena idea asegurarse de que está utilizando la base de datos correcta al hacer cosas como esta. Entonces podríamos agregar al código anterior cambiando explícitamente a la base de datos correcta:

USE Test;
EXEC sp_MSforeachtable @command1="ALTER TABLE ? NOCHECK CONSTRAINT ALL"

En este caso, cambio a una base de datos llamada Test .

Ejemplo 3:comprobar el resultado

Habiendo ejecutado el código anterior, ahora ejecutaré la misma consulta del primer ejemplo para ver el resultado.

SELECT
  OBJECT_NAME(parent_object_id) AS 'Table',
  name AS 'Constraint',
  is_disabled, 
  is_not_trusted
FROM sys.foreign_keys
UNION
SELECT 
  OBJECT_NAME(parent_object_id),
  name,
  is_disabled, 
  is_not_trusted
FROM sys.check_constraints;

Resultado:

+----------------+-----------------+---------------+------------------+
| Table          | Constraint      | is_disabled   | is_not_trusted   |
|----------------+-----------------+---------------+------------------|
| ConstraintTest | chkPrice        | 1             | 1                |
| ConstraintTest | chkValidEndDate | 1             | 1                |
| ConstraintTest | chkTeamSize     | 1             | 1                |
| Occupation     | chkJobTitle     | 1             | 1                |
+----------------+-----------------+---------------+------------------+

Por lo tanto, todas las restricciones en la base de datos se han deshabilitado (porque is_disabled la columna se establece en 1 para esas restricciones).

Tenga en cuenta que is_not_trusted la columna también se establece en 1 . Esta es una consideración importante, especialmente si tiene la intención de volver a habilitar cualquiera de sus restricciones deshabilitadas.

Consulte Lo que debe saber sobre WITH NOCHECK al habilitar una restricción CHECK en SQL Server para obtener información sobre cómo restaurar la confianza al volver a habilitar sus restricciones. La información de ese artículo también se aplica a las claves externas.

Deshabilitar las restricciones individualmente

Si solo desea deshabilitar las restricciones una por una, consulte Cómo deshabilitar una restricción CHECK en SQL Server para ver ejemplos.