2009-05-26 24 views

Respuesta

7

En primer lugar, un conflicto de claves indica que cualquiera que sea el proceso que esté utilizando actualmente es deficiente.

Para fusionar correctamente dos bases de datos que utilizan claves autogeneradas (non_GUID), debe realizar varios pasos. Primero agregue una nueva clave autogenerada a la tabla principal, luego importe todos los datos de ambas tablas, cambie el nombre del anterior, el archivo antiguo es ID_old y cambie el nombre de los archivos nuevos al nombre de identificación anterior. En este punto, puede continuar en las tablas secundarias. Tendrá que copiar a las tablas secundarias uniéndose a la tabla padre y tomando el nuevo campo de ID como el valor de la clave externa en lugar de la de la tabla existente. Tendrá que repetir este proceso para cada tabla de clave externa y si esa tabla también es una tabla principal, deberá agregar el campo de conversión a la tabla antes de copiar cualquier dato, para que pueda trabajar hasta el final de la cadena. . Hacer esto correctamente implica una gran cantidad de conocimiento de la estructura de la base de datos y mucha planificación. No considere hacer esto sin una buena copia de seguridad de ambas bases de datos fuente. También es mejor si el proceso puede suceder cuando ambas bases de datos están en modo de usuario único.

Si usa claves naturales y tiene duplicados, tiene un problema muy diferente. Todos los registros clave duplicados se moverán primero a una tabla separada y se determinará cuál es la información más correcta. En algunos casos, encontrará que la clave natural en realidad no es única (rara vez lo son, por lo que casi no la uso) y la base de datos combinada deberá funcionar con una clave autogenerada de algún tipo. Esto implicará cambios de código y cambios en la base de datos, por lo que es la opción de último recurso.

Lo que suele encontrar con las teclas naturales es que los datos para cada uno son diferentes pero simliar (St. vice Street en la dirección) en este caso marque uno de los registros para insertar y luego cuando lo inserte en dos pasos , primero los registros que no tienen duplicados, luego los registros en la tabla de duplicados que están marcados para la inserción. Recuerde que deberá examinar todos los registros en todas las tablas de claves foráneas para determinar qué conservar y cuáles no conservar. Solo descartar los duplicados es una mala idea y perderá datos de esa manera, posiblemente datos críticos (como las órdenes de un cliente). Este es un proceso largo y tedioso que requerirá que alguien con experiencia en los datos haga las determinaciones. Como programador, debe proporcionarles una herramienta de deduplicación que les permita examinar todos los datos de cada conjunto de duplicados y elegir qué conservar y de qué deshacerse, y luego marcarlos todo, ejecutará un proceso para insertar los registros. . Recuerda en tu diseño que para duplicados verdaderos, habrá algunas tablas secundarias (como órdenes) que necesitan los registros de ambos enviados a la base de datos para el registro elegido como el que deseas ingresar (las órdenes son un ejemplo), para otras tablas deseará elegir cuál es correcto (dirección, por ejemplo). Entonces puede ver que este es un proceso complejo que requiere una comprensión profunda de la base de datos.

Si tiene muchos duplicados, pueden estar limpiando y agregando los datos durante varios meses, por lo que una herramienta es realmente crítica. Las personas que hacen esto probablemente serán usuarios del sistema, no especialistas en bases de datos o programadores, ya que son las únicas personas que realmente pueden juzgar la mayor parte del itme en cuanto a qué registro conservar. Es probable que deba hacer algo similar en cualquier caso, ya que puede haber registros duplicados incluso cuando tiene una clave generada automáticamente. Ellos son simplemente más difíciles de encontrar.

No hay una manera fácil de unir dos bases de datos (incluso usando GUIDS, tiene el problema de los duplicados en la clave natural).

4

La mejor apuesta probablemente sea con una aplicación de terceros como RedGate SQL Data Compare. Cuesta un poco de dinero, pero vale la pena por escribir ese guion de OMI.

+2

¿Hay alguna alternativa de código abierto !!! – Ish

0

Para si tiene claves primarias como IDENTIDAD aquí está mi sugerencia (no debería requerir la modificación del esquema).

  1. Configure todas las claves externas de manera que ON UPDATE CASCADE está ajustado
  2. actualizar la clave/IDENTIDAD campo primario de la tabla primaria y agregar el valor máximo del campo de la tabla correspondiente que se va a combinar en (la FKs entonces en cascada los valores de las tablas secundarias)
  3. hacer lo mismo para los campos PK/identidad en las tablas secundarias
  4. seguir la sugerencia de this forum answer y utilizar SET IDENTITY_INSERT ON/OFF ambos lados de Inserción de cada una de las mesas, comenzando con la tabla padre y luego pasando a las tablas secundarias
5

Sé que este es un tema antiguo, pero tengo que comentar sobre el enfoque general que veo en muchas publicaciones y que está tratando de hacer todo de forma nativa mediante consultas SQL. Lo que estas soluciones tienen en común es la gran cantidad de tiempo que se debe invertir en crear y probar una consulta antes de aplicarla.

Así que sí, puede fusionar dos bases de datos de forma nativa mediante consultas relativamente complejas, pero puede ahorrarse mucho tiempo y utilizar herramientas de terceros de forma gratuita (la mayoría o todas tienen una versión de prueba completamente funcional).

Hay toneladas de estos en el mercado. Red Gate, ya mencionado en otra publicación, es uno de los mejores, pero también puedes probar ApexSQL Data Diff, dbForge, SQL Comparison toolset y muchos otros.

0

Puede agregar un campo adicional (llamado DatabaseID por ejemplo) a todas las tablas en su base de datos fusionada y agregarlo a las claves primarias. De esta forma, puede conservar las claves originales, al tiempo que tiene claves únicas en la base de datos fusionada, y puede decir de qué base de datos proviene la fila. Esto es lo que hace SQL-Hub: si solo se trata de un trabajo aislado, puede hacerlo con la versión de prueba gratuita.

Cuestiones relacionadas