Saltar al contenido

¿Qué es una RESTRICCIÓN DE CHEQUE CON CHEQUE?

Te sugerimos que pruebes esta solución en un ambiente controlado antes de enviarlo a producción, saludos.

Solución:

La página de documentación de MSDN sobre ALTER TABLE explica estos:

  • ALTER TABLE: modificar la estructura de la tabla
    (y algunas de las posibles acciones / modificaciones son):

    • CHECK CONSTRAINT ..: habilita la restricción
    • NOCHECK CONSTRAINT ..: deshabilita la restricción
      También hay pasos opcionales adicionales que se pueden realizar al crear / habilitar / deshabilitar una restricción:

      • WITH CHECK: verifique la restricción también
      • WITH NOCHECK: no verifique la restricción

En sus palabras:

| [ WITH  CHECK  ]  CHECK  CONSTRAINT   
     ALL 

WITH CHECK | WITH NOCHECK

Especifica si los datos de la tabla están o no validados contra un recién agregado o rehabilitado FOREIGN KEY o CHECK restricción. Si no se especifica, WITH CHECK se asume para nuevas restricciones, y WITH NOCHECK se asume para las restricciones rehabilitadas.

Si no desea verificar nuevos CHECK o FOREIGN KEY restricciones contra los datos existentes, utilice WITH NOCHECK. No recomendamos hacer esto, excepto en casos raros. La nueva restricción se evaluará en todas las actualizaciones de datos posteriores. Cualquier violación de restricción que sea suprimida por WITH NOCHECK cuando se agrega la restricción, las actualizaciones futuras pueden fallar si actualizan filas con datos que no cumplen con la restricción.

El optimizador de consultas no considera las restricciones definidas WITH NOCHECK. Estas restricciones se ignoran hasta que se vuelven a habilitar mediante el uso de ALTER TABLE mesa WITH CHECK CHECK CONSTRAINT ALL.

CHECK CONSTRAINT

Especifica que nombre_restricción está habilitado o deshabilitado. Esta opción solo se puede utilizar con FOREIGN KEY y CHECK limitaciones. Cuando NOCHECK se especifica, la restricción se deshabilita y las futuras inserciones o actualizaciones de la columna no se validan contra las condiciones de restricción. DEFAULT, PRIMARY KEY, y UNIQUE las restricciones no se pueden desactivar.

Prueba en dbfiddle:

CREATE TABLE a (aid INT PRIMARY KEY);

IR

INSERT INTO a (aid)
VALUES (1), (2), (3) ;

IR

3 rows affected
CREATE TABLE b 
( aid INT,
  bid INT PRIMARY KEY,
  CONSTRAINT [My_FORIEGN_KEY]
    FOREIGN KEY (aid) REFERENCES a (aid)
) ;

IR

INSERT INTO b (aid, bid)
VALUES
  (1, 11),
  (1, 12),
  (2, 21), 
  (3, 31) ;

IR

4 rows affected
INSERT INTO b (aid, bid)
VALUES
  (6, 61),
  (6, 62) ;

IR

Msg 547 Level 16 State 0 Line 1
The INSERT statement conflicted with the FOREIGN KEY constraint "My_FORIEGN_KEY". The conflict occurred in database "fiddle_792fce5de09f42908c3a0f91421f3522", table "dbo.a", column 'aid'.
Msg 3621 Level 0 State 0 Line 1
The statement has been terminated.
SELECT * FROM b ;

IR

aid | bid
--: | --:
  1 |  11
  1 |  12
  2 |  21
  3 |  31
ALTER TABLE b NOCHECK CONSTRAINT [My_FORIEGN_KEY];   --disable

IR

INSERT INTO b (aid, bid)
VALUES
  (4, 41),
  (4, 42) ;

IR

2 rows affected
SELECT * FROM b ;

IR

aid | bid
--: | --:
  1 |  11
  1 |  12
  2 |  21
  3 |  31
  4 |  41
  4 |  42
ALTER TABLE b WITH NOCHECK CHECK CONSTRAINT [My_FORIEGN_KEY];  
-- enable constraint without checking existing data

IR

SELECT * FROM b ;

IR

aid | bid
--: | --:
  1 |  11
  1 |  12
  2 |  21
  3 |  31
  4 |  41
  4 |  42
INSERT INTO b (aid, bid)
VALUES
  (6, 61),
  (6, 62) ;

IR

Msg 547 Level 16 State 0 Line 1
The INSERT statement conflicted with the FOREIGN KEY constraint "My_FORIEGN_KEY". The conflict occurred in database "fiddle_792fce5de09f42908c3a0f91421f3522", table "dbo.a", column 'aid'.
Msg 3621 Level 0 State 0 Line 1
The statement has been terminated.
SELECT * FROM b ;

IR

aid | bid
--: | --:
  1 |  11
  1 |  12
  2 |  21
  3 |  31
  4 |  41
  4 |  42
ALTER TABLE b WITH CHECK CHECK CONSTRAINT [My_FORIEGN_KEY];  
-- check existing data and enable constraint 

IR

Msg 547 Level 16 State 0 Line 1
The ALTER TABLE statement conflicted with the FOREIGN KEY constraint "My_FORIEGN_KEY". The conflict occurred in database "fiddle_792fce5de09f42908c3a0f91421f3522", table "dbo.a", column 'aid'.

valoraciones y comentarios

Si para ti ha sido provechoso este post, sería de mucha ayuda si lo compartes con otros entusiastas de la programación de esta forma contrubuyes a difundir este contenido.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *