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ónNOCHECK 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énWITH 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
oCHECK
restricción. Si no se especifica,WITH CHECK
se asume para nuevas restricciones, yWITH NOCHECK
se asume para las restricciones rehabilitadas.Si no desea verificar nuevos
CHECK
oFOREIGN KEY
restricciones contra los datos existentes, utiliceWITH 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 porWITH 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 deALTER TABLE
mesaWITH 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
yCHECK
limitaciones. CuandoNOCHECK
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
, yUNIQUE
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.