¿Cómo se pueden desactivar temporalmente las restricciones de clave externa mediante T-SQL?

¿Se pueden desactivar y activar las restricciones de clave foránea en SQL Server? ¿O mi única opción es abandonar y luego crear las restricciones?

Solución

Si quiere desactivar todas las restricciones de la base de datos, sólo tiene que ejecutar este código:

-- disable all constraints
EXEC sp_MSforeachtable "ALTER TABLE ? NOCHECK CONSTRAINT all"

Para volver a activarlas, ejecute: (la impresión es opcional, por supuesto, y es sólo una lista de las tablas)

-- enable all constraints
exec sp_MSforeachtable @command1="print '?'", @command2="ALTER TABLE ? WITH CHECK CHECK CONSTRAINT all"

Lo encuentro útil cuando se rellenan los datos de una base de datos a otra. Es mucho mejor que soltar las restricciones. Como has mencionado, es muy útil cuando se eliminan todos los datos de la base de datos y se repoblan (por ejemplo, en un entorno de prueba).

Si está borrando todos los datos, puede encontrar esta solución útil.

También a veces es útil desactivar todos los triggers, puedes ver la solución completa aquí.

Comentarios (21)

http://www.sqljunkies.com/WebLog/roman/archive/2005/01/30/7037.aspx

-- Disable all table constraints

ALTER TABLE MyTable NOCHECK CONSTRAINT ALL

-- Enable all table constraints

ALTER TABLE MyTable WITH CHECK CHECK CONSTRAINT ALL

-- Disable single constraint

ALTER TABLE MyTable NOCHECK CONSTRAINT MyConstraint

-- Enable single constraint

ALTER TABLE MyTable WITH CHECK CHECK CONSTRAINT MyConstraint
Comentarios (8)

El estándar SQL-92 permite declarar un constaint como DEFERRABLE para que pueda ser diferido (implícita o explícitamente) dentro del ámbito de una transacción. Lamentablemente, SQL Server sigue sin tener esta funcionalidad de SQL-92.

Para mí, cambiar una restricción a NOCHECK es algo parecido a cambiar la estructura de la base de datos sobre la marcha -eliminar restricciones ciertamente lo es- y algo que debe evitarse (por ejemplo, los usuarios requieren mayores privilegios).

Comentarios (0)