Altova MapForce 2023 Enterprise Edition

Cet exemple illustre les moyens se trouvant à votre disposition pour gérer les exceptions de base de données lors de la gestion d'un mappage qui modifie une base de données. La base de données utilisée dans cet exemple stocke des enregistrements d'utilisateur (users table) et les adresses (addresses table). Chaque utilisateur peut avoir zéro, un ou deux adresses (par exemple, une adresse personnelle et une adresse professionnelle). Concrètement, chaque adresse dans la table d'adresse contient un champ user_id qui pointes vers le champ id dans la table users. La table users est donc une table "parent" pour addresses. L'extrait de code suivant illustre les scripts de création SQL pour les deux tables (noter que la syntaxe est applicable à une base de données SQLite) :

 

CREATE TABLE
      users (id INTEGER NOT NULL PRIMARY KEY,
      first_name TEXT NOT NULL,
      last_name TEXT NOT NULL,
      email TEXT UNIQUE NOT NULL);
 
CREATE TABLE
      addresses (id INTEGER NOT NULL PRIMARY KEY,
      user_id INTEGER NOT NULL,
      is_shipping INTEGER,
      is_billing INTEGER,
      type TEXT NOT NULL,
      city TEXT NOT NULL,
      street TEXT NOT NULL,
      number INTEGER NOT NULL,
      FOREIGN KEY (user_id) REFERENCES users (id) ) ;

Table de source

L'exigence recherchée et de copier toutes les données provenant des tables users et addresses dans de nouvelles tables, concrètement, les tables new_users et new_addresses. Celles-ci sont presque identiques aux tables users et addresses. La seule différence est que la table new_addresses ne permet pas des valeurs null pour les colonnes is_shipping and is_billing, comme marqué en jaune dans l'extrait de code ci-dessous. Cela est important parce que cela signifie que des exceptions se produiront si des valeurs null sont rencontrées.

 

CREATE TABLE

      new_users (id INTEGER NOT NULL PRIMARY KEY,

      first_name TEXT NOT NULL,

      last_name TEXT NOT NULL,

      email TEXT UNIQUE NOT NULL);

 

CREATE TABLE

      new_addresses (id INTEGER NOT NULL PRIMARY KEY,

      user_id INTEGER NOT NULL,

      is_shipping INTEGER NOT NULL,

      is_billing INTEGER NOT NULL,

      type TEXT NOT NULL,

      city TEXT NOT NULL,

      street TEXT NOT NULL,

      number INTEGER NOT NULL,

      FOREIGN KEY (user_id) REFERENCES new_users (id) ) ;

Table de cible

Le mappage qui copie toutes les données des anciennes tables vers les tables récentes est illustré ci-dessous. Vous pouvez trouver ce mappage sous le chemin suivant : <Documents>\Altova\MapForce2023\MapForceExamples\Tutorial\DatabaseExceptions.mfd.

mf_rollback_ex_01

Comme illustré ci-dessus, ce mappage est configuré pour copier des données verbatim depuis un composant de base de données de source vers un composant de base de données de cible. Aucune autre transformation ne se produit, pour des raisons de simplicité. Dans cet exemple, aussi bien le composant de source et de cible appartient à la même base de données, seules les tables de source et de cible sont différentes. Cliquer sur la touche mf_ic_del_a_in et noter que tous les enregistrements sont configurés pour être supprimés avant chaque action d'insertion. Cela permet de garantir que les tables de cible sont toujours vides avant chaque insertion.

mf_rollback_ex_02

Comme indiqué précédemment, des exceptions se produiront si la table addresses de source contient des valeurs null. Vous pouvez contrôler que la table de source contient des valeurs null comme suit :

 

1.Cliquer sur l'onglet Requête DB.

2.Cliquer avec la touche de droite sur la table addresses, et choisir Afficher dans SQL Éditeur SQL | SELECT.

3.Cliquer sur Exécuter requête ic_execute-sql.

mf_rollback_ex_03

Comme illustré ci-dessus, il existe plusieurs champs NULL dans la table addresses de source. Vous disposez donc de plusieurs options pour gérer des exceptions pendant ce mappage, par exemple :

 

A) Si une exception quelconque est rencontrée, annuler tous les changements. En d'autres termes, ne pas insérer d'enregistrements si les données de source contient des enregistrement invalides.

B) Si une exception quelconque est rencontrée, sauter les enregistrements dans lesquels l'exception se produit mais garde les enregistrements d'insertion qui sont valides.

 

Scénario A : Annuler les changements sur l'exception

Exigence : Je dois annuler tous les changements dans la base de données si une exception se produit. Pour configurer le mappage :

 

1.Cliquer avec la touche de droite sur la barre de titre du composant de base de données cible et sélectionner Propriétés depuis le menu contextuel. En alternative, double-cliquer sur la barre de titre. Le dialogue Paramètres de composant de base de données s'ouvre.

2.Cocher la case Utiliser les transactions, et choisir annuler la transaction supérieure et arrêter.

 

Lorsque le mappage est configuré comme dans l'exemple ci-dessus, toute exception rencontrée entraînera l'annulation de la transaction de niveau supérieur au niveau du composant de base de données. Pour exécuter le mappage avec ces paramètres :

 

1.Cliquer sur l'onglet Sortie.

2.Dans le menu Sortie, cliquer Exécuter Script SQL. À ce niveau, le mappage rencontre une exception en raison d'une valeur null dans la table des adresses de source. Le dialogue Exception de transaction de base de données s'ouvre.

mf_rollback_ex_04

3.Ne pas modifier l'option présélection par défaut et cliquer sur OK.

 

Le résultat est le suivant :

 

Tous les changements sont annulés.

Aucun enregistrement n'est inséré dans la table new_users

Aucun enregistrement n'est inséré dans la table new_addresses

 

Scénario B : Annuler la transaction actuelle et continuer l'exécution

Exigence : Je souhaite sauter des enregistrements qui génèrent une exception mais qui continue d'insérer des enregistrement valides. Pour configurer le mappage afin d'accomplir ceci :

 

1.Cliquer sur la touche mf_ic_del_a_in située à côté de la table new_users table, cocher la case Utiliser transactions et choisir annuler la transaction actuelle et continuer

2.Cliquer sur la touche mf_ic_a_in située à côté de la table new_addresses table, cocher la case Utiliser transactions et choisir annuler la transaction actuelle et continuer

 

Lorsque vous exécutez le mappage avec ces paramètres, le dialogue Exception de transaction de base de données. Sélectionner les options comme indiqué ci-dessous pour n'annuler que la transaction actuelle et continue d'exécuter le mappage :

mf_rollback_ex_05

Le résultat est le suivant :  

 

Toutes les transactions erronées sont annulées.

5 utilisateurs de 5 sont insérés (parce qu'aucun enregistrement d'utilisateur n'a généré d'exception de base de données)

2 adresses de 5 sont insérés (parce que 3 adresses contiennent des valeurs null et des exceptions générées)

 

Scénario C : Annuler la transaction supérieur et continuer l'exécution

Exigence : si une adresse n'est pas insérée, l'enregistrement d'utilisateur parent ne doit pas non plus être inséré. Pour configurer le mappage pour accomplir cela :

 

1.Double-cliquer sur la barre de titre du composant de base de données et décocher la case Utiliser transactions.

2.Cliquer sur la touche mf_ic_del_a_in située à côté de la table new_users, cocher la case Utiliser transactions et choisir annuler la transaction actuelle et continuer

3.Cliquer sur la touche mf_ic_a_in située à côté de la table new_addresses, cocher la case Utiliser transactions et choisir annuler la transaction du haut et continuer

 

Lorsque vous exécutez le mappage avec ces paramètres, le dialogue Exception de transaction de base de données est affiché. Sélectionnez les options comme indiqué ci-dessous, et répétez le choix autant de fois que nécessaire :

mf_rollback_ex_06

Le résultat est le suivant :

 

2 utilisateurs sont insérés (Sharda Junker, Tobie Hughey)

1 adresse est insérée

 

Explication : L'utilisateur "Sharda Junker" est le seul utilisateur qui ne possède pas d'adresse. Aucune exception ne s'est produite pour cet enregistrement, donc il a été inséré. Le second utilisateur, "Tobie Hughey", a été inséré parce qu'il s'agit du seul utilisateur dans lequel aucune exception ne s'est produite au niveau de l'adresse. Tous les autres utilisateurs n'ont pas été insérés parce qu'ils avaient au moins une adresse lorsqu'une exception s'est produite et les transactions ont été annulées.

 

Il y a deux adresses qui n'ont pas de nulls et qui ne lancent donc pas d'exceptions. Ce sont les adresses avec id=1 et id=4. La The insert transaction for the first address, however, was rolled back because the parent user transaction had to be rolled back. Therefore, only the address with id=4 was inserted.

 

Veuillez noter que le même résultat peut aussi s'effectuer comme suit :

 

1.Cliquer sur la touche mf_ic_del_a_in située à côté de la table new_users, cocher la case Utiliser transactions et choisir annuler la transaction actuelle et continuer

2.Cliquer sur la touche mf_ic_a_in située à côté de la table new_addresses, et décocher la case Utiliser transactions.

 

Exécuter le mappage avec MapForce Server

Si vous avez mis MapForce Server sous licence, vous pouvez aussi exécuter le mappage au niveau de la ligne de commande, sur un appareil Linux, macOS ou Windows, comme suit :

 

1.Compiler le mappage dans un fichier d'exécution MapForce Server (.mfx) avec la commande de menu Fichier | Compiler sur le fichier d'exécution MapForce Server, voir aussi Compiler des mappages dans les fichiers d'exécution MapForce Server.

2.Copier le fichier .mfx et la base de données ExceptionsDemo.sqlite dans un répertoire sur le serveur. Nous l'appellerons "répertoire de travail".

3.Changer l'invite de commande dans le répertoire de travail et exécuter MapForce Server avec la commande ci-dessous :

 

mapforceserver run DatabaseExceptions.mfx

 

Notes :

 

mapforceserver est le chemin vers le programme d'exécution de MapForce Server tel qu'il est applicable pour votre système d'exploitation. Changer le chemin vers le fichier .mfx tel qu'applicable. Par exemple, sur un appareil Linux, le chemin est : /opt/Altova/MapForceServer2023/mapforceserver.

 

Dans l'exécution de serveur, vous pouvez aussi exécuter des mappages en tant qu'un appel API, ou en tant que tâches FlowForce Server, soit sur demande soit de manière récurrente. Pour plus d'informations, voir Automatisation avec MapForce Server.

© 2017-2023 Altova GmbH