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 | +--------------------------------+------------------+---------------------+---------------+------------------+