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

Cómo deshabilitar una restricción de clave externa en SQL Server (ejemplos de T-SQL)

Si se encuentra en una situación en la que necesita deshabilitar una restricción de clave externa en SQL Server, aquí le mostramos cómo hacerlo con Transact-SQL.

Esto le permitirá ingresar datos sin estar restringido por la clave externa. Obviamente, no harías esto a menos que tuvieras una muy buena razón para hacerlo. Las claves externas imponen la integridad referencial, por lo que deshabilitarlas tiene el potencial de crear todo tipo de problemas.

Ejemplo 1:deshabilitar la restricción de clave externa

Para deshabilitar una restricción de clave externa, use NOCHECK argumento dentro de una ALTER TABLE declaración.

Así:

ALTER TABLE BandMember 
NOCHECK CONSTRAINT FK_BandMember_Musician; 

Este código deshabilita una restricción de clave externa llamada FK_BandMember_Musician .

Ejemplo 2:revisar la restricción

Podemos consultar el sys.foreign_keys vista del sistema para verificar que nuestra restricción ha sido deshabilitada:

SELECT 
  name AS 'Constraint',
  is_disabled,
  is_not_trusted
FROM sys.foreign_keys;

Resultado:

+--------------------------------+---------------+------------------+
| Constraint                     | is_disabled   | is_not_trusted   |
|--------------------------------+---------------+------------------|
| FK_BandMember_Band             | 0             | 0                |
| FK_BandMember_Musician         | 1             | 1                |
| FK_MembershipPeriod_BandMember | 0             | 0                |
+--------------------------------+---------------+------------------+

En este caso, seleccioné todas las restricciones de clave externa de la base de datos actual.

Podemos ver que este es el único que está deshabilitado (porque es is_disabled la columna se establece en 1 ).

Puede notar que is_not_trusted la columna también se establece en 1 . Esto indica que el sistema no ha verificado la restricción.

Esto tiene sentido, porque ya no podemos asumir que la restricción ha verificado todos los datos. El hecho de que la restricción esté deshabilitada significa que los datos ahora pueden ingresar a la base de datos sin que la restricción los verifique. Por lo tanto, existe la posibilidad de que haya datos no válidos en la base de datos.

Si alguna vez necesita volver a habilitar la restricción, tendrá la oportunidad de restaurar la confianza de la restricción (mediante el WITH CHECK opción). Esto verificará todas las filas existentes antes de habilitar la restricción.

También tendrá la opción de no verificar los datos existentes, pero esto solo debe hacerse en casos excepcionales.

Aquí está la misma consulta nuevamente, pero con algunas columnas adicionales para mostrar las tablas y las tablas a las que se hace referencia:

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

Resultado:

+--------------------------------+------------------+---------------------+---------------+------------------+
| Constraint                     | Table            | Referenced Table    | is_disabled   | is_not_trusted   |
|--------------------------------+------------------+---------------------+---------------+------------------|
| FK_BandMember_Band             | BandMember       | Band                | 0             | 0                |
| FK_BandMember_Musician         | BandMember       | Musician            | 1             | 1                |
| FK_MembershipPeriod_BandMember | MembershipPeriod | BandMember          | 0             | 0                |
+--------------------------------+------------------+---------------------+---------------+------------------+