Migration des bases de données

La migration des bases de données est généralement une tâche assez complexe qui ne suppose pas uniquement un transfert de données entre des types et des formats de stockage d’un serveur à un autre, mais également la réécriture de phrases SQL, également les procédures (SP) de logique de l’activité.

En comparaison avec les schémas standards de migration manuelle, nous offrons une gamme puissante d’outils développés et d’efficacité prouvée pour des modèles complexes de bases de données relationnelles. A l’aide de ces outils et de nos spécialistes, vous pouvez envisager sereinement les transferts des bases de données, indépendamment de la nature du système.

De par notre expérience, nous sommes habitués à la complexité, aux coûts que supposent une lourde migration de bases de données et aux problèmes qui peuvent surgir durant le processus lorsque l’on n’emploie pas des méthodes appropriées; nous vérifions ainsi toujours avec les clients potentiels si nos outils et méthodes peuvent apporter un avantage notable.

Outils de migration

Comparé à une consultation standard de migrations, qui ne peut guère offrir plus qu’un support à la base de données, nous avons une grande expérience dans l’écriture de grandes applications d’entreprise dans la syntaxe de la base de données native et cross. En outre, nous enseignons aux équipes des entreprises une méthodologie et nous leur apportons une puissante gamme d’outils pour réduire les coûts et optimiser le processus de migration.

Ces outils incluent :

  • Outil de copie multi-bases de données avec conversion automatique à partir des types de données (y compris types de données géométriques)
  • Vérification du schéma multi-base de données
  • Grammaire SQL XML
  • Grammaire DDL XML
  • Grammaire DML XML
  • Grammaire SPL XML
  • Grammaire Triggers XML
  • Support pour la conversion de types de données géométriques

Copie multi-base de données

L’outil de copie peut répliquer, indépendamment du moteur, toutes les données à partir d’une base de données vers une destination, créant des tables, des indices, des restrictions et le mappage des types de données lorsque les moteurs sont différents. En peu d’effort et après la période que nécessite la copie des données, il est possible de voir et exploiter ses données dans une nouvelle base. Évidemment, dans ces cas, il n’y a pas de migration.

  • Génère des structures de tables conformément aux types de données cibles.
  • Désactive automatiquement les triggers et les séquences durant le processus de copie.
  • Installe automatiquement les séquences après avoir copié une table.
  • Supporte la génération de bases de données croisées rowid
  • Supporte la conversion de types de données géométriques permettant une migration facile de moteurs spatiaux.
  • Supporte la construction d’indices post-copie et des foreign keys
  • Supporte la compilation de triggers post-copie et SPL

Vérification du schéma multi-bases de données

Une fois que la migration a commencé, il est possible de générer un schéma XML à partir de la base de données initiale. Cela permet de traduire le modèle de base de données dans n’importe quel moteur.

Cependant, que se passe-t-il si le système continue à fonctionner et subit des changements structuraux durant le processus de migration ? Durant la vérification du schéma, les bases de données de types différents sont comparées et la différence entre les structures de tables, les clés primaires, les foreign keys, les indices et les restrictions sont mises en exergue. Il est également possible de faire des comparaisons avec le modèle de schéma principal en XML. Dans les deux cas, une proposition de changement est présentée afin de s’assurer qu’il y a la même structure physique.

Support au développement, test, pré-production et production

Les outils de migration sont construits autour d’un dictionnaire de base de données. Le dictionnaire permet au programmateur de stocker le code (phrases DML, requêtes SQL, code SPL, données de tables initiales, etc.), qui constitue la base de données des applications. Une fois stocké dans le dictionnaire, un groupe de commandes Web ou de ligne de commandes permet la compilation, la vérification ou la sortie de nouvelles actualisations pour une base de données ou un groupe.

Syntaxe XML-XSQL

Le moteur de traduction de triggers DDL, DML, SPL fournit une structure avec une syntaxe commune XML, à partir de laquelle les développeurs peuvent écrire des applications dans une syntaxe indépendante de celle de la base de données.

XML-XSQL syntaxe disponible

DDL

Le processus de copie d’une base de données peut créer automatiquement un modèle XML qui génère le Data Definition Language (DDL) de la base de données. Il est possible de voir toutes les tables et les objets définis dans une définition naturelle XML qui permettra la traduction en ligne de la base de données souhaitée.

DDL – XML transformation sample

DML

Une grammaire XML permet d’écrire les phrases SQL indépendantes de la base de données.

DML – XML transformation sample

Procédures stockées (SPL)

La logique commerciale écrite dans les procédures stockées (SPL), les fonctionnalités ou les triggers doit être réécrite manuellement en XML. Notre société vous offre ce service ou vous montre comment le faire vous-mêmes. À partir de là, vous pourrez traduire automatiquement la logique vers le moteur de votre choix.

Cette étape a un grand avantage sur la codification manuelle conventionnelle car le moteur de traduction Axional XSQL valide et génère le code approprié sans erreur humaine.

Le gestionnaire de la procédure stockée (SPL) se charge du statut de compilation dans la base de données de votre choix (développement, test et production).

SPL – XML transformation sample

Triggers

Si vous avez des systèmes de déclenchement vous connaissez peut-être la complexité et les différences que requiert l’écriture de systèmes de déclenchement indépendants de la base de données. Tout comme pour les procédures (SPL), il est possible d’utiliser une syntaxe XML et le moteur de traduction générera les triggers appropriés pour la base de donnée souhaitée.

Trigger – XML transformation sample


Types de données géométriques

Lorsque la base de données a des types de données géométriques, elle représente un cas particulier. Nous proposons la transportabilité entre Oracle Spatial, DB2 Spatial Extender, Informix Spatial DataBlade et Postgres PostGIS. La syntaxe DML offre une large gamme de fonctionnalités pour écrire des demandes indépendantes de SQL et le moteur de copie DB pour transférer les données en toute sécurité.

<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 

Veuillez trouver ci-dessous une liste des fonctionnalités géométriques disponibles avec la syntaxe 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