¿Se admiten las deshabilitaciones y habilitaciones de restricciones de clave externa en SQL Server? O es mi única opción para drop
y luego re-create
las limitaciones?
824
¿Se admiten las deshabilitaciones y habilitaciones de restricciones de clave externa en SQL Server? O es mi única opción para drop
y luego re-create
las limitaciones?
Respuestas:
Si desea deshabilitar todas las restricciones en la base de datos, simplemente ejecute este código:
Para volver a encenderlos, ejecute: (la impresión es opcional, por supuesto, y solo enumera las tablas)
Me resulta útil al completar datos de una base de datos a otra. Es un enfoque mucho mejor que soltar restricciones. Como mencionó, resulta útil al soltar todos los datos en la base de datos y repoblarlos (por ejemplo, en un entorno de prueba).
Si está eliminando todos los datos, puede encontrar esta solución útil.
También a veces es útil deshabilitar todos los disparadores, puede ver la solución completa aquí .
fuente
"ALTER TABLE ? WITH CHECK CHECK CONSTRAINT all"
¿Debería haber solo un "CHEQUE" allí?http://www.sqljunkies.com/WebLog/roman/archive/2005/01/30/7037.aspx
fuente
Para deshabilitar la restricción, tiene
ALTER
la tabla usando NOCHECKPara permitirle tener que usar doble CHECK :
Una vez completado, si necesita verificar el estado, use este script para enumerar el estado de restricción. Será muy útil:
fuente
sys.sysforeignkeys
msdn.microsoft.com/en-us/library/ms177604.aspxSu mejor opción es DROP y CREATE restricciones de clave externa.
No encontré ejemplos en esta publicación que funcionen para mí "tal cual", uno no funcionaría si las claves externas hacen referencia a diferentes esquemas, el otro no funcionaría si la clave externa hace referencia a varias columnas. Este script considera ambos, múltiples esquemas y múltiples columnas por clave externa.
Aquí está la secuencia de comandos que genera instrucciones "ADD CONSTRAINT", para varias columnas las separará por comas ( asegúrese de guardar esta salida antes de ejecutar instrucciones DROP ):
Aquí está el script que genera las declaraciones "DROP CONSTRAINT":
fuente
El estándar SQL-92 permite que una constante se declare como DEFERRABLE para que pueda diferirse (implícita o explícitamente) dentro del alcance de una transacción. Lamentablemente, a SQL Server todavía le falta esta funcionalidad SQL-92.
Para mí, cambiar una restricción a NOCHECK es similar a cambiar la estructura de la base de datos sobre la marcha, las restricciones de caída ciertamente lo son, y algo que debe evitarse (por ejemplo, los usuarios requieren mayores privilegios).
fuente
Estoy de acuerdo contigo, Hamlin. Cuando transfiere datos utilizando SSIS o cuando desea replicar datos, parece bastante necesario deshabilitar o eliminar temporalmente las restricciones de clave externa y luego volver a habilitarlas o recrearlas. En estos casos, la integridad referencial no es un problema, porque ya se mantiene en la base de datos de origen. Por lo tanto, puede estar seguro con respecto a este asunto.
fuente
fuente
WITH CHECK CHECK
es casi seguro que se requiere!Este punto se planteó en algunas de las respuestas y comentarios, pero creo que es lo suficientemente importante como para volver a mencionarlo.
Volver a habilitar una restricción con el siguiente comando (no
WITH CHECK
) tendrá algunos inconvenientes serios .Nota: WITH NOCHECK es el valor predeterminado para volver a habilitar las restricciones. Tengo que preguntarme por qué ...
La vista del sistema sys.foreign_keys proporciona cierta visibilidad del problema. Tenga en cuenta que tiene tanto una
is_disabled
como unais_not_trusted
columna.is_disabled
indica si las futuras operaciones de manipulación de datos se validarán contra la restricción.is_not_trusted
indica si todos los datos actualmente en la tabla han sido validados contra la restricción.¿Se debe confiar en sus limitaciones? Descubrir...
fuente
Primer comentario :)
Para el OP, la solución de kristof funcionará, a menos que haya problemas con datos masivos y problemas de globo de registro de transacciones en grandes eliminaciones. Además, incluso con el almacenamiento de tlog de sobra, ya que las eliminaciones de escritura en el tlog, la operación puede llevar mucho tiempo para tablas con cientos de millones de filas.
Utilizo una serie de cursores para truncar y volver a cargar copias grandes de una de nuestras enormes bases de datos de producción con frecuencia. La solución diseñada representa múltiples esquemas, múltiples columnas de clave externa, y lo mejor de todo puede ser procesado para su uso en SSIS.
Implica la creación de tres tablas de preparación (tablas reales) para alojar los scripts DROP, CREATE y CHECK FK, la creación e inserción de esos scripts en las tablas, y luego recorrer las tablas y ejecutarlas. La secuencia de comandos adjunta consta de cuatro partes: 1.) creación y almacenamiento de las secuencias de comandos en las tres tablas de etapas (reales), 2.) ejecución de las secuencias de comandos FK de caída mediante un cursor, una por una, 3.) Uso de sp_MSforeachtable para truncar todos los tablas en la base de datos que no sean nuestras tres tablas de preparación y 4.) ejecución de los scripts FK de creación y verificación al final de su paquete ETL SSIS.
Ejecute la parte de creación del script en una tarea Ejecutar SQL en SSIS. Ejecute la parte "ejecutar scripts de Drop FK" en una segunda tarea Ejecutar SQL. Coloque el script de truncamiento en una tercera tarea Ejecutar SQL, luego realice cualquier otro proceso ETL que necesite hacer antes de adjuntar los scripts CREATE y CHECK en una tarea Ejecutar SQL final (o dos si lo desea) al final de su flujo de control.
El almacenamiento de los scripts en tablas reales ha demostrado ser invaluable cuando la nueva aplicación de las claves foráneas falla, ya que puede seleccionar * de sync_CreateFK, copiar / pegar en su ventana de consulta, ejecutarlas de una en una y corregir los problemas de datos una vez que encuentre los que fallaron / todavía no pueden volver a aplicar.
No vuelva a ejecutar el script nuevamente si falla sin asegurarse de volver a aplicar todas las claves / verificaciones foráneas antes de hacerlo, o lo más probable es que pierda algo de creación y verifique los scripts fk a medida que se eliminan nuestras tablas de preparación y recreado antes de la creación de los scripts para ejecutar.
fuente
Encuentra la restricción
Ejecute el SQL generado por este SQL
Camino seguro.
Nota: Se agregó una solución para eliminar la restricción para que la tabla se pueda descartar o modificar sin ningún error de restricción.
fuente
Haga clic con el botón derecho en el diseño de la tabla y vaya a Relaciones y elija la clave externa en el panel del lado izquierdo y en el panel del lado derecho, establezca Aplicar restricción de clave externa en 'Sí' (para habilitar restricciones de clave externa) o 'No' (para deshabilitarlo).
fuente
La respuesta marcada '905' se ve bien pero no funciona.
Lo siguiente funcionó para mí. NO se puede deshabilitar ninguna clave principal, clave única o restricciones predeterminadas . De hecho, si 'sp_helpconstraint' 'muestra' n / a 'en status_enabled - Significa que NO se puede habilitar / deshabilitar.
- Para generar script para DESACTIVAR
- Para generar script para HABILITAR
fuente
En realidad, debería poder deshabilitar las restricciones de clave externa de la misma manera que deshabilita temporalmente otras restricciones:
Solo asegúrese de deshabilitar la restricción en la primera tabla listada en el nombre de la restricción. Por ejemplo, si mi restricción de clave externa era FK_LocationsEmployeesLocationIdEmployeeId, me gustaría usar lo siguiente:
aunque violar esta restricción producirá un error que no necesariamente indica que esa tabla es la fuente del conflicto.
fuente
Una secuencia de comandos para gobernarlos a todos: combina comandos truncar y eliminar con sp_MSforeachtable para que pueda evitar soltar y volver a crear restricciones: solo especifique las tablas que deben eliminarse en lugar de truncarse y para mis propósitos he incluido un filtro de esquema adicional para siempre medida (probado en 2008r2)
fuente
Puede deshabilitar temporalmente las restricciones en sus tablas, hacer el trabajo y luego reconstruirlas.
Aquí hay una manera fácil de hacerlo ...
Deshabilite todos los índices, incluidas las claves primarias, que deshabilitarán todas las claves externas, luego vuelva a habilitar solo las claves primarias para que pueda trabajar con ellas ...
[Hacer algo, como cargar datos]
Luego, vuelva a habilitar y reconstruir los índices ...
fuente
@sql
siempre se trunca. :(Tengo una versión más útil si estás interesado. Levanté un poco de código de aquí un sitio web donde el enlace ya no está activo. Lo modifiqué para permitir una matriz de tablas en el procedimiento almacenado y llena las instrucciones de soltar, truncar y agregar antes de ejecutarlas todas. Esto le da control para decidir qué tablas necesitan truncarse.
fuente