none
Segmentar una base de datos completamente SQL SERVER STANDARD 2005 RRS feed

  • Pregunta

  • Buen día!!!

    El motivo de mi consulta es para segmentar una base de datos completa. 

    Por ejemplo.

    Tengo una base de datos(MIBASE) muy grande que contiene registros de 3 años 1999, 2000, 2001 quiero de esa base de datos obtener 3 bases de datos que contengan registros de su respectivo año,(MIBASE1999),(MIBASE2000) y (MIBASE2001).

    Estas bases fueron creadas con SQL SEVER STANDARD 2005 R2, existe alguna manera con algún proceso, o tendría que copiar de manera masiva filtrando por fechas todos los datos y todas las tablas de la base completa a una base creada con las mismas tablas????

    Gracias de antemano.

    jueves, 7 de septiembre de 2017 20:21

Respuestas

  • El mensaje de error indica, efectivamente, que se ha duplicado un dato en la clave primaria. Si se sabe seguro que en la tabla original no existen duplicados (por tratarse también de la clave primaria en dicha tabla, y haber verificado que no existe corrupción), entonces la causa más probable es que por error hayas ejecutado dos veces la inserción sobre la misma tabla de destino (por ejemplo, si primero intentaste insertar unos datos y dio error a medias y después volviste a hacer la inserción sin haber borrado esos registros que quedaron de la vez anterior, o alguna cosa por el estilo).
    martes, 12 de septiembre de 2017 20:07

Todas las respuestas

  • Sí, me temo que tendrás que hacerlo a mano. No hay un automatismo que detecte en todas las tablas cuál es la columna que debe usar para segmentar, y que saque solo los datos de un rango de fechas de cada una de ellas. Tendrás que ir tabla por tabla haciendo la Select que filtre por fecha y pasando los datos a una tabla en otra base de datos, y tendrás que hacerlo con cuidado de respetar el orden de las Foreign Keys para que no te dé errores al insertar en las tablas de destino sin haber copiado sus dependencias. Si lo escribes en un script que tome las fechas como parámetro, entonces después de haberlo hecho una vez será muy fácil volverlo a ejecutar para los otros dos segmentos cambiando el rango de fechas.
    • Propuesto como respuesta Jorge TurradoMVP viernes, 8 de septiembre de 2017 7:13
    viernes, 8 de septiembre de 2017 6:49
  • Muchas gracias por responder a mi duda.

    Intente ejecutar un script simple para copiar todos los datos de una tabla a otra:

    INSERT INTO MIBASEDESTINO.dbo.tabla1
    SELECT * FROM MIBASEORIGEN.dbo.tabla1
    where fecha_operacion between '1999-01-01' and '1999-12-31'

    me arroja estos errores:

    Msg 207, Level 16, State 1, Line 16
    Invalid column name 'fecha_operacion'.
    Msg 215, Level 16, State 1, Line 16
    Parameters supplied for object 'MIBASEORIGEN.tabla1' which is not a function. If the parameters are intended as a table hint, a WITH keyword is required.

     :(

    viernes, 8 de septiembre de 2017 15:03
  • ¿Seguro que has copiado exacta y literalmente la sentencia SQL exacta que está produciendo ese error? Lo digo porque ese mensaje de error típicamente sale cuando pones paréntesis en la SELECT detrás de la tabla.
    viernes, 8 de septiembre de 2017 18:52
  • Perdon estuve realizando lo siguiente:

    creé una base de datos exactamente igual a la que tengo de origen por script(sin datos, solo estructura)

    después me dí a la tarea de ubicar tabla por tabla, todos los campos ya que si no pongo todas las columnas exactamente, no me permite copiar nada:

    SET IDENTITY_INSERT MITABLADESTINO ON;
    INSERT INTO MIBASEDESTINO.dbo.MITABLADESTINO(columna1,columna2,columna3,columna4,columna5)
    SELECT columna1,columna2,columna3,columna4,columna5
    FROM MIBASEORIGEN.dbo.MITABLAORIGEN
    where fecha between '2001-01-01' and '2001-12-31'
    SET IDENTITY_INSERT MITABLADESTINO  OFF;

    el SET IDENTITY_INSERT  lo puse ya que en algunas tablas me lo exigía si no no me dejaba, empezaba a ir bien comenzaban a pasarse los datos tabla por tabla hasta que comencé con problemas por las KEYS

    The INSERT statement conflicted with the FOREIGN KEY constraint

    dije bueno saco script de drop y de create, dropeo en MIBASEDESTINO los KEYS y despues de terminar el proceso los vuelvo a crear, pero son demasiados KEYS, existe alguna otra manera de respaldar todos los KEYS de golpe y volverlos a restaurar????

    viernes, 8 de septiembre de 2017 19:20
  • The INSERT statement conflicted with the FOREIGN KEY constraint

    Exactamente por ese motivo es por el que yo te dije en mi respuesta anterior lo de "tendrás que hacerlo con cuidado de respetar el orden de las Foreign Keys para que no te dé errores al insertar en las tablas de destino sin haber copiado sus dependencias".

    Ahí tienes la solución posiblemente más sencilla, para no tener que borrar y recrear todas las Foreign keys. Simplemente cambia el orden en el que copias los datos de las tablas de manera que siempre se copia primero cada dependencia antes de copiar la tabla que depende de ella. Por ejemplo, si tienes una tabla de Pedidos que tiene un campo "IdCliente" que es una foreign key que apunta a la tabla de Clientes, entonces es importante que en el orden de copia la tabla de clientes se copie ANTES que la de Pedidos para evitar el error. Aplicando el mismo criterio con todas las tablas, al final te saldrá cuál es el orden en el que tienes que copiarlas para que no haya errores en las FK.

    viernes, 8 de septiembre de 2017 19:44
  • Buen día!!!

    Antes que nada muchas gracias por la atención, estoy en un punto en el que estoy tratando de encontrar conforme a las dependencias de las keys un orden de como copiar los datos, ahora intenté con una tabla la cual al parecer no me dió problemas con FOREIGN KEYS pero ahora es esté el error de duplicar las key primaria me parece

    INSERT INTO BASEDESTINO.dbo.pais(nm_pais,nombre)
    SELECT
    O.nm_pais,O.nombre
    FROM
    baseorigen.dbo.pais AS O
    JOIN BASEDESTINO.dbo.pais D ON O.nm_pais <> D.nm_pais

    y el error es el siguente:

    Msg 2627, Level 14, State 1, Line 127
    Violation of PRIMARY KEY constraint 'pk_pais'. Cannot insert duplicate key in object 'dbo.pais'.
    The statement has been terminated.

    ¿¿¿hay algo que pueda hacer en estos casos o.O???

    de antemano muchas gracias

    martes, 12 de septiembre de 2017 19:02
  • El mensaje de error indica, efectivamente, que se ha duplicado un dato en la clave primaria. Si se sabe seguro que en la tabla original no existen duplicados (por tratarse también de la clave primaria en dicha tabla, y haber verificado que no existe corrupción), entonces la causa más probable es que por error hayas ejecutado dos veces la inserción sobre la misma tabla de destino (por ejemplo, si primero intentaste insertar unos datos y dio error a medias y después volviste a hacer la inserción sin haber borrado esos registros que quedaron de la vez anterior, o alguna cosa por el estilo).
    martes, 12 de septiembre de 2017 20:07