Migración de bases de datos

La migración de bases de datos es generalmente una tarea compleja que no sólo supone transferir datos entre tipos de almacenaje y formatos de un servidor de base de datos a otro; sino que también supone reescribir sentencias SQL o incluso procedimientos (SPL) de lógica de negocio.

En comparación con los esquemas estándares de migración a mano, ofrecemos una potente gama de herramientas desarrolladas de probada eficacia en complejos módulos de bases de datos relacionales. Estas herramientas y nuestros especialistas pueden asegurar que las transiciones de las bases de datos se realicen perfectamente, independientemente de la naturaleza del sistema.

Desde la experiencia, estamos familiarizados con la complejidad, el coste que supone una larga migración de bases de datos y los problemas que aparecen durante el proceso cuando se emplean métodos inapropiados; ya que siempre comprobamos con los clientes potenciales que el uso de nuestras herramientas y métodos pueda ofrecer una ventaja significativa.

Herramientas de migración

En comparación con la consultoría estándar de migraciones, la cual puede ofrecer poco más que soporte a la base de datos, nosotros tenemos gran experiencia en escribir grandes aplicaciones para empresas en sintaxis de la base de datos nativa y cross. Además, enseñamos a los equipos de las empresas una metodología y les proporcionamos una potente gama de herramientas para reducir costes y optimizar el proceso de migración.

Estas herramientas incluyen:

  • Herramienta de copia multi-bases de datos con conversión automática desde los tipos de datos (incluyendo tipos de datos geométricos)
  • Comprobación del esquema multi-base de datos
  • Grámatica SQL XML
  • Gramática DDL XML
  • Gramática DML XML
  • Gramática SPL XML
  • Gramática Triggers XML
  • Soporte para la conversión de tipos de datos geométricos

Copia multi-base de datos

La herramienta de copia puede replicar todos los datos desde una base de datos a una destinación, independientemente del motor, las tablas creadas, los índices, las restricciones y el mapeo de tipos de datos cuando los motores difieren. Con poco esfuerzo, y después del tiempo que supone copiar los datos, se puede ver y explorar los datos en la nueva base de datos. Por supuesto, no se realiza una migración en estos casos.

  • Genera estructuras de tablas acorde con los tipos de datos objetivo
  • Desactiva automáticamente triggers y secuencias durante el proceso de copia
  • Instala automáticamente la secuencia asociada después de copiar una tabla
  • Soporta la generación de bases de datos cruzadas rowid
  • Soporta la conversión de tipos de datos geométricos permitiendo una fácil migración de motores espaciales
  • Soporta la construcción de índices post-copia y foreign keys
  • Soporta la compilación de triggers post-copia y SPL

Comprobación del esquema multi-bases de datos

Una vez se empieza una migración, se puede generar un esquema XML desde la base de datos original. Esto permite traducir el modelo de base de datos a cualquier motor.

Sin embargo, ¿qué pasa si el sistema continúa operando e incluso sufre cambios estructurales durante el proceso de migración? La comprobación del esquema compara las bases de datos de tipos diferentes y muestra las diferencia entre estructuras de tablas, claves primarias, foreign keys, índices y restricciones. También, se puede hacer una comparación con el modelo de esquema maestro en XML. En ambos casos, se aplicará una propuesta de cambios para asegurar que se muestra la misma estructura física.

Soporte al desarrollo, test, pre-producción y producción

Las herramientas de migración están construidas alrededor de un diccionario de base de datos. El diccionario permite a los programadores almacenar su código (sentencias DML, queries SQL, código SPL, datos de tablas iniciales, etc.), el cual constituye la base de datos de las aplicaciones. Una vez almacenado en el diccionario, un grupo de comandos web o comandos shell permite la compilación, el chequeo o la salida de nuevas actualizaciones para una base de datos o un grupo.

Sintaxis XML-XSQL

El motor de traducción de triggers DDL, DML, SPL proporciona una estructura con una sintaxis común XML, en la cual los desarrolladores pueden escribir aplicaciones en una sintaxis independiente de la propia del motor de base de datos.

XML-XSQL syntax available

DDL

El proceso de copia de una base de datos puede crear automáticamente un modelo XML que genera el Data Definition Language (DDL) de la base de datos. Se pueden ver todas las tablas y objetos definidos en una definición natural XML que permitirá la traducción on-line a la base de datos deseada.

DDL – XML transformation sample

DML

Una gramática XML permite escribir sentencias SQL independientes de la base de datos.

DML – XML transformation sample

Procedimientos (SPL)

La lógica de negocio escrita en procedimientos (SPL), funciones o triggers debe ser reescrita manualmente en XML. Nosotros ofrecemos este servicio o enseñamos como hacerlo. A partir de entonces, se podrá traducir automáticamente la lógica al motor que se desee.

Este paso tiene una mayor ventaja sobre la codificación manual convencional, ya que el motor de traducción Axional XSQL validará y generará el código apropiado sin errores humanos.

El manager de procedimientos (SPL) se encargará del status de compilación en las bases de datos deseadas (desarrollo, test y producción).

DDL – XML transformation sample

Triggers

Si tiene triggers, quizás es conocedor de la complejidad y las diferencias que supone escribir triggers independientes de la base de datos. Como en el caso de los procedimientos (SPL), se puede utilizar gramática XML y el motor de de traducción generará los triggers apropiados para la base de datos deseada.

DDL – XML transformation sample


Tipos de datos geométricos

Cuando la base de datos tiene tipos de datos geométricos, constituye un caso especial. Ofrecemos transportabilidad entre Oracle Spatial, DB2 Spatial Extender, Informix Spatial DataBlade y Postgres PostGIS. La gramática DML ofrece una amplia gama de funciones para escribir queries independientes de SQL y el motor de copia DB tranferir los datos de forma segura.

<select>
    <columns>
        d.the_geom,
        d.id,
        d.p1,
        d.p2,
        d.p3,
        d.p4,
        d.p5,
        d.p6
    </columns>
    <from alias='d' >
        <select>
            <columns>
                bican_zonas_censales_data.p1,
                bican_zonas_censales_data.p2,
                bican_zonas_censales_data.p3,
                bican_zonas_censales_data.p4,
                bican_zonas_censales_data.p5,
                bican_zonas_censales_data.p6,
                bican_zonas_censales_data.id,
                <geo.asWkt>bican_zonas_censales.the_geom</geo.asWkt> the_geom
            </columns>
            <from alias='c' >
                <select>
                    <columns>
                       <geo.buffer>
                            <geom1><geo.aggrUnion pg_collect='y'>bican_areas_influencia.the_geom</geo.aggrUnion></geom1>
                            <dist>0</dist>
                       </geo.buffer> the_geom
                    </columns>
                    <from table='bican_areas_influencia' />
                    <where>
                        bican_areas_influencia.id_oficina = '#oficina'
                    </where>
                </select>
                <join table='bican_zonas_censales'>
                    <on>
                        <geo.intersects>
                            <geom1>c.the_geom</geom1>
                            <geom2>bican_zonas_censales.the_geom</geom2>
                       </geo.intersects>
                    </on>
                </join>
                <join table='bican_zonas_censales_data'>
                    <on>bican_zonas_censales.gid = bican_zonas_censales_data.id</on>
                </join>
            </from>
        </select>
    </from>
</select>
-- ************************************************************************************
-- DEISTER WebStudio XSQL-SELECT Tue Oct 11 11:21:50 CEST 2011 Engine: ids
-- ************************************************************************************
SELECT
        d.the_geom,
        d.id,
        d.p1,
        d.p2,
        d.p3,
        d.p4,
        d.p5,
        d.p6                  

  FROM (SELECT
                bican_zonas_censales_data.p1,
                bican_zonas_censales_data.p2,
                bican_zonas_censales_data.p3,
                bican_zonas_censales_data.p4,
                bican_zonas_censales_data.p5,
                bican_zonas_censales_data.p6,
                bican_zonas_censales_data.id,
                ST_AsText(bican_zonas_censales.the_geom) the_geom     

  FROM (SELECT
                       ST_Buffer(SE_Dissolve(bican_areas_influencia.the_geom),0) the_geom            

  FROM bican_areas_influencia
 WHERE 

                        bican_areas_influencia.id_oficina = '#oficina' 

) c
      ,bican_zonas_censales
      ,bican_zonas_censales_data
 WHERE 

                        ST_Intersects(c.the_geom,bican_zonas_censales.the_geom)
                     AND
       bican_zonas_censales.gid = bican_zonas_censales_data.id

) d
 WHERE 

                        ST_Intersects(c.the_geom,bican_zonas_censales.the_geom)
                     AND
       bican_zonas_censales.gid = bican_zonas_censales_data.id
-- ************************************************************************************
-- DEISTER WebStudio XSQL-SELECT Tue Oct 11 11:21:50 CEST 2011 Engine: oracle
-- ************************************************************************************
SELECT 
        d.the_geom,
        d.id,
        d.p1,
        d.p2,
        d.p3,
        d.p4,
        d.p5,
        d.p6                  
    
  FROM (SELECT 
                bican_zonas_censales_data.p1,
                bican_zonas_censales_data.p2,
                bican_zonas_censales_data.p3,
                bican_zonas_censales_data.p4,
                bican_zonas_censales_data.p5,
                bican_zonas_censales_data.p6,
                bican_zonas_censales_data.id,
                SDO_UTIL.TO_WKTGEOMETRY(bican_zonas_censales.the_geom) the_geom     
            
  FROM (SELECT 
                       SDO_GEOM.SDO_BUFFER(SDO_AGGR_UNION(SDOAGGRTYPE(bican_areas_influencia.the_geom,0.05)),0,0.05) the_geom            
                    
  FROM bican_areas_influencia
 WHERE 

                        bican_areas_influencia.id_oficina = '#oficina' 
                    
) c
      ,bican_zonas_censales
      ,bican_zonas_censales_data
 WHERE 
       
                        SDO_ANYINTERACT(c.the_geom,bican_zonas_censales.the_geom)
                     AND 
       bican_zonas_censales.gid = bican_zonas_censales_data.id

) d
 WHERE 
       
                        SDO_ANYINTERACT(c.the_geom,bican_zonas_censales.the_geom)
                     AND 
       bican_zonas_censales.gid = bican_zonas_censales_data.id
-- ************************************************************************************
-- DEISTER WebStudio XSQL-SELECT Tue Oct 11 11:21:50 CEST 2011 Engine: postgres
-- ************************************************************************************
SELECT
        d.the_geom,
        d.id,
        d.p1,
        d.p2,
        d.p3,
        d.p4,
        d.p5,
        d.p6                  

  FROM (SELECT              
                bican_zonas_censales_data.p1,
                bican_zonas_censales_data.p2,
                bican_zonas_censales_data.p3,
                bican_zonas_censales_data.p4,
                bican_zonas_censales_data.p5,
                bican_zonas_censales_data.p6,
                bican_zonas_censales_data.id,
                ST_AsText(bican_zonas_censales.the_geom) the_geom     

  FROM (SELECT
                       ST_Buffer(ST_Collect(bican_areas_influencia.the_geom),0) the_geom            

  FROM bican_areas_influencia
 WHERE 

                        bican_areas_influencia.id_oficina = '#oficina' 

) c
       INNER JOIN bican_zonas_censales ON
                        ST_Intersects(c.the_geom,bican_zonas_censales.the_geom)

       INNER JOIN bican_zonas_censales_data ON bican_zonas_censales.gid = bican_zonas_censales_data.id

) d
-- ************************************************************************************
-- DEISTER WebStudio XSQL-SELECT Tue Oct 11 11:21:50 CEST 2011 Engine: sqlserver
-- ************************************************************************************
SELECT 
        d.the_geom,
        d.id,
        d.p1,
        d.p2,
        d.p3,
        d.p4,
        d.p5,
        d.p6                  
    
  FROM (SELECT                 
                bican_zonas_censales_data.p1,
                bican_zonas_censales_data.p2,
                bican_zonas_censales_data.p3,
                bican_zonas_censales_data.p4,
                bican_zonas_censales_data.p5,
                bican_zonas_censales_data.p6,
                bican_zonas_censales_data.id,
                bican_zonas_censales.the_geom.STAsText() the_geom     
            
  FROM (SELECT 
                       -- Tag [geo.aggrUnion] not defined for engine sqlserver.BufferWithTolerance(0,,) the_geom            
                    
  FROM bican_areas_influencia
 WHERE 

                        bican_areas_influencia.id_oficina = '#oficina' 
                    
) c
       INNER JOIN bican_zonas_censales ON 
                        c.the_geom.STIntersects(bican_zonas_censales.the_geom)
                    
       INNER JOIN bican_zonas_censales_data ON bican_zonas_censales.gid = bican_zonas_censales_data.id

) d 

Debajo, hay una lista de las funciones geométricas que están disponibles con la gramática XML:

Informix Datablade Postgres PostGis Oracle Spatial SQLServer Spatial DB2 Spatial Extender
ST_Point
ST_Line
St_Polygon
getType
getX
getY
getZ
getEnvelope
isValid
getCoordDim
getDim
getSRID
getNumVertices
asKml
asGml
asWkt
asWkb
asSvg
transform
reverseLine
distanceCartesian
distanceSphere
distanceSpheroid
length
lengthSpheroid
perimeter
area
centroid
withinDist
equals
touches
overlaps
covers
coveredBy
contains
within
intersects
disjoint
intersection
buffer
simplify
convexHull
difference
symDifference
aggrUnion
aggrMbr
aggrConvexHull