Estoy tratando de usar el Asistente de importación y exportación de SQL Server para copiar datos de mi base de datos de producción a mi base de datos de desarrollo, pero cuando lo hago falla el error "El estado INSERTAR está en conflicto con la restricción FOREIGN KEY" Tengo más de 40 tablas con lotes de las restricciones FK, ¿hay alguna manera fácil de lidiar con esto sin tener que escribir un script de restricción de caída / agregar restricción?
Editar: Acabo de descubrir que en la edición web de SQL Server, que es lo que estoy ejecutando, DTS no le permitirá guardar paquetes.
sp_msforeachtable
(ysp_MSForEachDb
) no está documentado ni soportado. No debe / evite usarlo. ¡Puede saltarse las mesas! Vea esta publicación de @AaronBertrand -> sqlblog.com/blogs/aaron_bertrand/archive/2010/12/29/… y este elemento de conexión - (MS indica que no lo solucionarán) -> connect.microsoft.com/SQLServer / feedback / details / 264677 /…Produje una copia exacta de una base de datos en mi máquina desde un servidor que no controlaba.
Soy un imbécil , pero esto es lo que hice:
Creé la base de datos a partir de mi script que estaba en control de origen (pista, pista). Si no tiene la secuencia de comandos, siempre puede generarla desde la base de datos existente a través de la
Tasks
opción.Si algún dato se insertó automáticamente en YourDB en la creación, ejecute a
DELETE FROM YourDB.dbo.tblYourTable
.DELETE
.Ejecute esto en su servidor de destino:
USE YourDB; EXEC sp_msforeachtable 'ALTER TABLE ? NOCHECK CONSTRAINT all';
Haga clic derecho en YourDB en
Object Explorer
. Haga clic enTasks
->Import Data...
Las primeras pantallas del asistente se explican por sí mismas.
En la
Select Source Table and Views
pantalla del asistente, haga clic en la casilla de verificación junto a cada tabla que desee copiar.Para cada fila (tabla) en esa pantalla, haga clic en ella para que quede resaltada y luego haga clic
Edit Mappings
.Para cada fila (tabla), haga clic / verifique
Append rows to the destination table
yEnable identity insert
.Delete rows in destination table
, fallará porque no emite unDELETE
comando, emite unTRUNCATE
comando que aún entra en conflicto con nuestras claves externas porqueTRUNCATE
no se rige por elNOCHECK CONSTRAINT
de antes.Haga clic en el resto del asistente y haga clic
Finish
.Esté atento a los errores ; Es probable que las advertencias estén bien ignoradas.
Report
botón y vea el informe. Tratar de suss lo que era unaSuccess
,Error
yStopped
. Probablemente necesitará corregir la causa raíz del error que está oculto en ese informe en alguna parte. Entonces, probablemente necesites hacer unDELETE FROM YourDB.dbo.theErrorTable
. Ahora haga clic en el botón Atrás en el asistente de importación y desmarque cada tabla que era unSuccess
. Repetir ad infinitum.Ejecute esto en su servidor de destino:
USE YourDB; EXEC sp_msforeachtable 'ALTER TABLE ? WITH CHECK CHECK CONSTRAINT all';
¡Hurra! :)
Gracias a todos los que respondieron esta pregunta y preguntas similares a esta en la red SE por ayudarme a resolver esto.
fuente
En el asistente de importación, puede eliminar las filas primero y, si tiene campos de identidad, puede habilitar la inserción de identidad de la siguiente manera
Si desea deshabilitar la restricción de verificación, cuando el asistente le solicite que guarde el paquete, guárdelo y luego edite el administrador de conexión de la siguiente manera:
Nota: No puede TRUNCAR la tabla cuando hay claves foráneas definidas.
fuente
No sueltes las restricciones.
Lo que debe hacer es guardar el paquete SSIS que crea el asistente y luego editarlo en BIDS / SSDT. Cuando edite el paquete, podrá controlar el orden en que se procesan las tablas para poder procesar las tablas principales y luego procesar las tablas secundarias cuando todas las tablas principales estén listas.
fuente
Problemas como este nos muestran que las personas que hacen el servidor SQL nunca han usado su producto. Esta es una omisión tan evidente que uno tiene que preguntarse qué más se olvidaron de hacer correctamente (tengo una lista de otros 30 problemas enloquecedores como este que tuve que superar para que esto funcione como lo hacen otros DB) de la caja; incluido el hecho de que necesitamos un pésimo asistente para hacer esto en primer lugar [si tuviera el tiempo que he pasado esperando que este asistente se conecte y enumere las mismas tablas para el mismo DB, cada vez, de regreso ... tendría tiempo para unas buenas vacaciones]).
Soy muy vago y no quiero escribir
EXEC sp_msforeachtable ...
dos veces cada vez que hago esto. Mi trabajo ha sido dejar las restricciones en el servidor de producción y eliminarlas del servidor de desarrollo. Esto evitará el error, pero este método tiene algunos efectos secundarios MUY GRANDES. Primero, ya no podrá restaurar una copia de seguridad completa en su servidor de desarrollo (a menos que esté de acuerdo con eliminarlos de nuevo). En segundo lugar, esto funciona mejor cuando está seguro de que los consumidores de sus datos también imponen estas restricciones (o no les importan). En mi caso, solo tenemos un consumidor (nuestro sitio web), por lo que también hemos incorporado estas restricciones en el código del sitio (es decir, antes de eliminar un registro de usuario, primero eliminamos todos los registros telefónicos de ese usuario). Si, esto esencialmente niega la necesidad de restricciones en primer lugar y duplica el trabajo que necesito hacer, pero también me da la oportunidad de verificar que mi código funcione con o sin restricciones basadas en DBMS (el hecho es que todavía están en el producto servidor solo como un plan de contingencia). Podría llamar a esto una falla en mi diseño, pero prefiero llamarlo una solución para un DBMS defectuoso. En cualquier caso, aún es más rápido y fácil hacerlo en cualquier otro lugar que desde MSSQL porque no puede hacer frente a su propio diseño.fuente
Creo que no puede realizar copias de seguridad y restaurar desde el servidor de producción, ya que son datos cruciales. Bueno, sin los derechos adecuados, realmente se vuelve más complicado. Pero si tiene db backup n restore en este momento, puede hacerlo.
O bien, una forma que recomendaría es eliminar todas sus restricciones e índices y luego agregarlos nuevamente una vez que los datos se hayan importado o exportado.
No es una respuesta exacta, pero se procesará rápidamente.
fuente
Solo lee ese tema. Es una publicación antigua, pero esto es lo que hice para ayudar a las futuras personas a leer esto.
En mi caso, quería importar a una tabla idéntica vacía. Al editar el mapeo, selecciono
<ignore>
la clave principal. Todo mi contenido se agrega automáticamente de manera agradable.Espero que ayude a alguien
fuente