IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 Firebird Discussion :

Fusionner 2 bases de données


Sujet :

Firebird

  1. #1
    Futur Membre du Club
    Homme Profil pro
    biologiste analyste
    Inscrit en
    Janvier 2016
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : biologiste analyste

    Informations forums :
    Inscription : Janvier 2016
    Messages : 11
    Points : 7
    Points
    7
    Par défaut Fusionner 2 bases de données
    Bonjour,

    Je voudrais savoir si il est possible de fusionner deux bases de données différentes sous firebird? Chacune contenant un grand nombre de tables?

    Merci d'avance.

  2. #2
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 136
    Points : 38 909
    Points
    38 909
    Billets dans le blog
    9
    Par défaut
    C'est ce qu'on appelle une convergence de S.I.
    Le problème n'est pas tant technique que fonctionnel et organisationnel

    Il faut identifier les doublons fonctionnels. Par exemple, monsieur dupont marc de la base n°1 est il le même que M. dupont marc de la base n°2
    Si non, cas le plus simple (individu autonome), on ajoute le dupont de la base source dans la base cible sous un nouvel identifiant, nouvel identifiant qui sera propagé à toutes les tables filles
    Si oui, cas le plus complexe(individu commun), il s'agit d'un doublon fonctionnel, auquel cas déterminer les écarts de données entre les 2 bases et décider de règles pour savoir ce que l'on conserve de part et d'autres
    Il faut donc établir des règles pour définir les critères selon lesquels on conserve les données de la cible, ou de la source, des priorisation de ces règles, et des combinatoires.
    La difficulté est aussi de faire un tableau de bord qui permet de valider les millions ou milliards de lignes que l'on va transporter et transformer, car la cible résultante de la convergence ne représente pas le total des enregistrements des 2 sources puisqu'il y a des communs.
    Il faut donc à chaque étape, suivre le nombre de fusion, de rejet, et de reconduction pour être en capacité de valider le processus.

    Les projets de convergence sont des projets passionnants, dans lesquels il faut aussi avoir à l'esprit les performances du traitement, car bien évidement, il faut que l'opération s'exécute sans gêner la gestion. Le plus souvent, ce genre de projet s'exécute sur un WE (idéalement à l'occasion d'un WE long) et en mode 24h/24, avec des tirs d'échantillons, et des répétitions préalables en taille réelle sur environnement dupliqué pour vérifier à la fois le processus de convergence, et le fonctionnement d'ensemble suite à ce traitement.

  3. #3
    Futur Membre du Club
    Homme Profil pro
    biologiste analyste
    Inscrit en
    Janvier 2016
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : biologiste analyste

    Informations forums :
    Inscription : Janvier 2016
    Messages : 11
    Points : 7
    Points
    7
    Par défaut
    D'accord, de fait cela n'est pas simple.

    Mes bases de donnees ont des données communes telles que des ID mais c'est tout ce qu'elles ont en commun. Je dois fusionner et avoir les toutes les infos des deux bases pour ces ID justement.
    Point de vue pratico pratique, comment réaliser la convergence alors?

  4. #4
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 046
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 046
    Points : 40 962
    Points
    40 962
    Billets dans le blog
    62
    Par défaut
    Bonjour,

    j'ai du mal à saisir le "fusionner" s'agit t-il de faire de deux bases un seule comme l'entends escartefigue ou d'obtenir les informations entre les deux bases de données, via une procedure ou un EXECUTE STATEMENT et la clause ON EXTERNAL [DATASOURCE] (valable à partir de 2.5) pour interroger les deux bases ?

    Si seules les 'ID' sont en commun et les tables créées, quelques procédures ou même triggers feront l'affaire. j'avais un projet qui utilisait ce genre de pratique (deux bases identiques une par société , l'une servant de référence pour un ensemble de tables "paramètres" et contenant des triggers (AfterInsert,AfterUpdate,AfterDelete) pour mettre à jour la seconde au besoin malheureusement le projet réalisé a été abandonné par la suite et du coup, suite à des restore de la base principale je n'ai plus accès à ces triggers.


    [Edit] finalement si, j'avais gardé le script de bascule
    en voici un extrait pour une table simple (un Code< identifiant , un Libellé)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    -- ACHEMINEMENT ------------------------------------------------------------------
    SET TERM ^ ;
    CREATE TRIGGER AUI_ACHEMINEMENT FOR ACHEMINEMENT
    ACTIVE AFTER INSERT OR UPDATE POSITION 0
    AS
    DECLARE VARIABLE STMT VARCHAR(250); 
    BEGIN 
        STMT='UPDATE OR INSERT INTO ACHEMINEMENT (CODE, LIBELLE)
         VALUES (?,?)';
     
    	EXECUTE STATEMENT 
    	(STMT)(NEW.CODE,NEW.LIBELLE)
    	ON EXTERNAL DATA SOURCE 'localhost:OMJBase' AS USER 'SYSDBA' PASSWORD 'masterkey';
    END^
    SET TERM ; ^
     
    SET TERM ^ ;
     
    CREATE TRIGGER AD_ACHEMINEMENT FOR ACHEMINEMENT
    ACTIVE AFTER DELETE POSITION 0
    AS
    DECLARE VARIABLE STMT VARCHAR(250); 
    BEGIN 
     STMT='DELETE FROM ACHEMINEMENT WHERE CODE=?';
     EXECUTE STATEMENT (STMT)(OLD.CODE)
     ON EXTERNAL DATA SOURCE 'localhost:OMJBase' AS USER 'SYSDBA' PASSWORD 'masterkey'; 
    END^
     
    SET TERM ; ^
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  5. #5
    Futur Membre du Club
    Homme Profil pro
    biologiste analyste
    Inscrit en
    Janvier 2016
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : biologiste analyste

    Informations forums :
    Inscription : Janvier 2016
    Messages : 11
    Points : 7
    Points
    7
    Par défaut
    Pardon si je ne suis pas très clair.

    Donc je dois via une requete, obtenir des informations provenant de deux bases de données différentes où seul des ID sont similaires. voilà pourquoi je parle de fusion mais ce n'est peut être pas le bon terme.

  6. #6
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 136
    Points : 38 909
    Points
    38 909
    Billets dans le blog
    9
    Par défaut
    La convergence de S.I. est un processus long, qui est généralement mis en œuvre suite à la fusion juridique de 2 entreprises, afin de faire des 2 Systèmes d'information distincts un S.I. unique. La convergence est d'ailleurs souvent précédée d'une phase de Migration de S.I. qui consiste à passer d'une type de système à un autre, car pour converger 2 S.I., il est beaucoup plus simple d'avoir des S.I. homogènes.

    Bref, si vous voulez uniquement accéder aux données des 2 databases, mais en conservant les 2 gisements de données distincts, alors vous n'avez pas besoin de passe par une convergence. Parler en ce cas de fusion me semble très abusif.

  7. #7
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 046
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 046
    Points : 40 962
    Points
    40 962
    Billets dans le blog
    62
    Par défaut
    Bonjour,

    c'est donc bien sur ON EXTERNAL [DATABASE] qu'il va falloir travailler donc soit au sein de procedures ou de triggers, soit au sein d'un EXECUTE BLOCK mais si et seulement si la version de Firebird est 2.5 ou plus.

    Schématiquement:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    SET TERM ^;
    EXECUTE BLOCK RETURNS(<ColonnesTable1>, <ColonnesBase2:Table2>)
    AS
    DECLARE VARIABLE ID INTEGER;  // si id n''était pas dans ColonnesTable1
    BEGIN
     FOR SELECT <Colonnes de Table1> FROM TABLE1 INTO <:ColonnesTable>
       DO BEGIN
          EXECUTE STATEMENT ('SELECT <ColonnesTable2> FROM TABLE2 WHERE ID=?'
         ON EXTERNAL DATA SOURCE 'localhost:<alias>' AS USER 'sysdba' PASSWORD 'masterkey')(:ID); 
         INTO <:ColonnesBase2:Table2>;
         SUSPEND;
       END 
    END^
    SET TERM ;^
    où <ColonnesTable1> est la liste des colonnes de la table dans la base de données connectée
    <ColonnesBase2:Table2> la liste des colonnes de la table de la base externe
    <Colonnes de Table1> les colonnes à sélectionner
    <:ColonnesTable> correspond à la liste des colonnes (un : devant) récupérées
    <:ColonnesBase2:Table2> idem
    à noter l'utilisation du paramètre (:ID) pour le execute statement

    comme c'est très schématique, un exemple de ce que vous voulez serait nécessaire pour écrire quelque chose de concret donc : description de deux tables (une dans chaque base) et description (champs) du résultat souhaité.
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  8. #8
    Futur Membre du Club
    Homme Profil pro
    biologiste analyste
    Inscrit en
    Janvier 2016
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : biologiste analyste

    Informations forums :
    Inscription : Janvier 2016
    Messages : 11
    Points : 7
    Points
    7
    Par défaut
    Je vais essayer de faire un exemple avec les infos et je reviens vers vous dès que possible

    Merci beaucoup

  9. #9
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 381
    Points : 19 066
    Points
    19 066
    Par défaut
    Salut à tous.

    J'ai retrouvé le lien dont Sergiomaster aborde le sujet dans le post #4.
    --> http://www.firebirdfaq.org/faq16/

    La question est de savoir si l'on doit ou non rapatrier la seconde base de données dans le même espace que la premier.
    Puis ensuite de faire un traitement afin de "fusionner", peut-être dans une nouvelle structure, les tables.

    Une possible solution serait de faire un "merge".
    --> http://www.firebirdsql.org/refdocs/l...d21-merge.html

    Nous restons en attente d'un exemple de Larbuisson.

    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

Discussions similaires

  1. Fusionner deux bases de données
    Par alatox dans le forum JDBC
    Réponses: 1
    Dernier message: 18/06/2009, 11h55
  2. Fusionner deux bases de données
    Par mboyaka dans le forum Access
    Réponses: 4
    Dernier message: 04/12/2008, 17h46
  3. fusionner deux base de données - comment faire
    Par leclone dans le forum Langage SQL
    Réponses: 1
    Dernier message: 04/04/2007, 10h09
  4. fusionner des base de données Bugzilla
    Par Konrad Florczak dans le forum Requêtes
    Réponses: 1
    Dernier message: 30/11/2006, 13h44
  5. [Conception] fusionner deux base de donné
    Par youcef81 dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 03/08/2006, 17h45

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo