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.
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.
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.
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?
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
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.
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.
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:
où <ColonnesTable1> est la liste des colonnes de la table dans la base de données connectée
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 ;^
<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
Je vais essayer de faire un exemple avec les infos et je reviens vers vous dès que possible
Merci beaucoup
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
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager