¿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?
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í.
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
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).