2011-01-24 12 views
11

Estoy intentando generar algunos scripts de inserción utilizando el Asistente de scripts de SQL Server 2008. Al generar las secuencias de comandos, aparece el siguiente error:Cómo evitar errores cíclicos de clave externa al intentar generar scripts de datos de inserción en SQL 2008

"La base de datos seleccionada contiene claves foráneas que crean un ciclo. La publicación de datos no es compatible con bases de datos con relaciones cíclicas de clave externa."

He intentado desactivar y eliminar todas las restricciones en la base de datos. El error todavía está ocurriendo. ¿Hay alguna forma de evitar esto? Posiblemente haga que SQL ignore las restricciones al generar las secuencias de comandos.

+1

Como no debe tener un diseño que tenga restricciones cíclicas de clave externa, le sugiero que primero arregle su diseño incorrecto. Incluso si puede deshabilitar las restricciones para la inserción, es una muy mala idea ya que obtendrá problemas de ingetridad de datos. Tu diseño es incorrecto, arréglalo. – HLGEM

+0

Además de lo que ha declarado HLGEM, si no puede insertar datos usando una secuencia de comandos directamente en la base de datos, ¿cómo diablos la GUI podrá hacerlo? – Thomas

Respuesta

0

Primero en mi humilde opinión La respuesta de HHOHGEM es un poco despreocupada: en ocasiones hay razones válidas para tener referencias cíclicas.

Dicho esto, creo que el generador de scripts es hipersensible. Parece pensar que cualquier par de PK/FK es "cíclico" y terminé teniendo que usar una copia de mi base de datos de la cual había despojado todas las claves para que la exportación fuera más allá del error "cíclico". Un script como el siguiente puede ayudarte a soltar claves globalmente pero por supuesto ¡ten cuidado!

SELECT 'ALTER TABLE' + object_name (parent_obj) + 'DROP CONSTRAINT' + [nombre] como secuencia de comandos de sysobjects donde xtype IN ('F')

[yo no escribí esto. Consulte http://www.sqlteam.com/forums/topic.asp?TOPIC_ID=46682]

Además, la herramienta es bastante inútil en términos de retroalimentación, ya que su informe no proporciona suficientes detalles para restringir dónde se supone que referencias cíclicas existen.

Finalmente, encontré que la herramienta es bastante escamosa ya que obtengo tiempos de espera aleatorios. Otra observación que no he investigado extensamente es que creo que la herramienta puede requerir que empiece desde cero después del error cíclico para borrar su caché, ya que veo un comportamiento diferente cuando uso el botón Anterior o reinicio.

0

Puede exportar los datos estableciendo la opción de escritura - "script Restricciones de comprobación" en False

Lo sentimos, esto no funciona :(

que tendrá que determinar la tabla está causando el problema

.
18

En la página del Asistente donde elige el botón de opción para seleccionar Todos los Objetos de Base de Datos u Objetos Específicos, asegúrese de seleccionar Todos los Objetos de Base de Datos Por alguna razón la herramienta necesita algo allí para generar incluso si solo desea

Una vez que cambié el botón de opción a Todos los Objetos de Base de Datos, y seleccioné la opción Avanzada para generar Tipo de secuencia de comandos = Solo Datos, funcionó completamente.

+1

"Todos los objetos de base de datos" hace el truco, gracias. –

+0

Haciendo un volcado de datos de demostración a un servidor local antes de una conferencia y la interfaz había cambiado y de repente no estaba funcionando (supongo que actualicé SSMS o algo así) ... esto funcionó y me salvó el trasero, ¡Gracias! – Erikest

+0

¿Y si quiero ejecutar las instrucciones de inserción en otra base de datos, debería ejecutar SQL para otros objetos también? – mounaim

2

guardarlas en un archivo vs.a una nueva ventana del editor de consultas parece hacer que funcione para mí en Management Studio 2008: \

+1

Definitivamente un error en SSMS. Más allá de tu solución, si presionas el botón Atrás y das una nueva oportunidad para generar en una nueva ventana de consulta (simplemente cambiando el botón de opción), sí se genera. –

0

Recibía el mismo error porque no tenía una tabla seleccionada en la lista de objetos (una gran tabla que quería crear) en otro guion). Seleccionar todas las tablas resolvió el problema.

PD: Tal vez un poco tarde, pero la búsqueda de CyclicalForeignKeyException ocupa el primer lugar en Google.

11

Tuve el mismo problema que el OP. Luego intenté de nuevo, esta vez en las opciones avanzadas, para la opción "tipos de datos para script", seleccioné "esquema y datos" en lugar de solo datos. Entonces funcionó para mí sin quejarse de las claves cíclicas.

+0

¿Y por qué esto funciona? – Michael

+0

Esa es una buena solución para 1 tabla, funciona para mí con "esquema y datos" en lugar de solo datos. Entonces es solo un caso de editar el script de salida para dejar los INSERT (y cualquier SET IDENTITY_INSERT ON/OFF antes y después). ¡Mucho más fácil que escribir todo el db! Gracias –

+0

Esto funcionó para mi para varias tablas, incluso cuando el scripting de claves foráneas estaba deshabilitado, etc. gracias – Sk93

Cuestiones relacionadas