Actions de table BD : Scénarios
Site web d’Altova : MapForce, les vidéos démo
Ce chapitre discute certains des scénarios possibles pour utiliser les actions de Table de base de données. Tous les scénarios utilisent une base de données hiérarchique appelée BookCatalog.sqlite. Cette base de données a trois tables : Authors (parent), Books (child), TrackingInfo (non connecté à toute autre table). Les tables Authors et Books ont une relation de clé étrangère. Il est important de noter qu’il y a configuration autoincrement pour les clés primaires dans les tables Authors et Books. La structure de la base de données est décrite dans le script ci-dessous :
CREATE TABLE
"main"."Authors" (
"AuthorID" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
"Author" TEXT,
"Country" TEXT,
"Website" TEXT
);
CREATE TABLE
"main"."Books" (
"BookID" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
"Title" TEXT,
"AuthorID" INTEGER,
"ISBN" TEXT,
"Publisher" TEXT,
"NumPages" INTEGER,
"Year" INTEGER,
"Genre" TEXT,
"Price" DECIMAL,
FOREIGN KEY ("AuthorID") REFERENCES "Authors" ("AuthorID") ON DELETE CASCADE ON UPDATE NO ACTION
);
CREATE TABLE
"main"."TrackingInfo" (
"MappedOn" DATETIME
);
Scénario 1 : Supprime toutes les données BD et insère toutes les données source
Dans le premier scénario, nous voulons supprimer toutes les données depuis la base de données BookCatalog.sqlite et peupler la base de données avec toutes les données depuis le fichier source. Notre mappage a l’air de ceci :
Même si la base de données a trois tables, seules Authors et Books sont incluses dans le composant de base de données. Puisque rien n’est mappé dans la table TrackingInfo, cette table est absente depuis le composant. Puisque « autoincrement » est définie pour les tables Authors et Books, nous n’avons pas besoin de connecter quoique ce soit dans les colonnes AuthorID et BookID : ces ID seront générées automatiquement par la base de données.
Actions de table BD pour les auteurs
Les actions de table pour la table Authors (capture d’écran ci-dessous) ont été configurées de la manière suivante :
•Dans la section instruction SQL à exécuter avant le premier enregistrement, nous avons défini l’action SUPPRIMER qui supprimera tous les enregistrements de la base de données, y compris tous les enregistrements enfant.
•Dans la section Actions à exécuter pour chaque enregistrement, nous avons défini l’action Insérer tout.
•Les ID Author seront générées automatiquement par la base de données (l’option BD générée dans l’action Insérer tout).
•Les autres valeurs seront mappées depuis le fichier source.
Actions de table BD pour les Books
Pour la table Books, nous avons défini la même action Insérer tout (capture d’écran ci-dessous). Les ID Book seront générées par la base de données. La colonne AuthorID référence la clé primaire dans la table Authors. Les valeurs pour cette colonne seront fournies automatiquement. Toutes les autres valeurs seront mappées depuis le fichier source.
Sortie
La liste de codes ci-dessous affiche un extrait de la sortie :
DELETE FROM "Books"
DELETE FROM Authors
INSERT INTO "Authors" ("Author", "Country", "Website") VALUES ('Stephen King', 'US', 'www.stephenking.com')
SELECT "AuthorID" FROM "Authors" WHERE "AuthorID" = last_insert_rowid()
-- >>> %AuthorID1%
INSERT INTO "Books" ("AuthorID", "Title", "ISBN", "Publisher", "NumPages", "Year", "Genre", "Price") VALUES ('%AuthorID1%', 'Misery', '1501143107', 'Scribner', 368, 2016, 'Horror', 11.99)
INSERT INTO "Books" ("AuthorID", "Title", "ISBN", "Publisher", "NumPages", "Year", "Genre", "Price") VALUES ('%AuthorID1%', 'Outsider', '1501180983', 'Scribner', 576, 2018, 'Horror', 12.79)
Notez que les instructions SQL dans la sortie sont à des fins d’information uniquement. Pour exécuter les instructions SQL, ouvrez le volet Sortie et exécutez la commande de barre d’outils Exécuter Script SQL/NoSQL. Pour plus d’information, voir Instructions SQL dans la Sortie.
Scénario 2 : Mettre à jour les auteurs et livres, insérer rest, insère l’info de traçage
Dans des situations réelles, la base de données est constamment en train de changer, et plusieurs personnes pourraient travailler dans la même base de données. Pour cette raison, supprimer tous les enregistrements de base de données peut être indésirable. Dans le deuxième scénario, nous avons l’objectif suivant :
•Pour mettre à jour les auteurs et livres qui existent dans le fichier source et la base de données
•Pour insérer les enregistrements source qui n’existent pas dans la base de données
•Pour fournir une information de traçage sur la date et l’heure du mappage
Notre mappage a les mêmes composants et connexions comme dans le premier scénario. Toutefois, les actions de table de base de données ont été configurées différemment (voir ci-dessous)
Actions de table BD pour les auteurs
La capture d’écran ci-dessous affiche les actions définies pour la table des Authors. Dans la condition Update If, nous avons défini la valeur equal dans la colonne Author. Ceci signifie que ‘il y a des auteurs avec le même nom dans la source et dans la base de données, uniquement les enregistrements d’auteur seront mis à jour dans la base de données. Les auteurs qui existent uniquement dans le fichier source seront simplement insérés dans la base de données. Les auteurs qui existent uniquement dans la base de données resteront inchangés.
Actions de table BD pour les Books
Nous avons la même combinaison d’actions pour la table Books (voir ci-dessous). Cette fois, la valeur égale est définie dans la colonne Titre. Ceci signifie qu‘il y a des mêmes livres dans la source et la base de données, les enregistrements book seront mis à jour dans la base de données. Les Livres qui existent uniquement dans la source seront insérés dans la base de données. Les Livres qui existent uniquement dans la base de données resteront inchangés.
Aucun enregistrement dupliqué
L’avantage majeur de la condition Update If est qu’elle prévient d’obtenir des enregistrements doubles dans la base de données.
Sortie
La liste de codes ci-dessous affiche un extrait de la sortie :
UPDATE "Authors" SET "Country" = 'US', "Website" = 'www.stephenking.com' WHERE ("Authors"."Author" = 'Stephen King')
SELECT "AuthorID" FROM "Authors" WHERE ("Author" = 'Stephen King')
-- >>> %AuthorID1%
UPDATE "Books" SET "ISBN" = '1501143107', "Publisher" = 'Scribner', "NumPages" = 368, "Year" = 2016, "Genre" = 'Horror', "Price" = 11.99 WHERE ("Books"."AuthorID" = '%AuthorID1%') AND ("Books"."Title" = 'Misery')
UPDATE "Books" SET "ISBN" = '1501180983', "Publisher" = 'Scribner', "NumPages" = 576, "Year" = 2018, "Genre" = 'Horror', "Price" = 12.79 WHERE ("Books"."AuthorID" = '%AuthorID1%') AND ("Books"."Title" = 'Outsider')
Solution alternative
Pour éviter les enregistrements doubles dans la table Books, vous pouvez aussi choisir de supprimer les enregistrements enfant (voir ci-dessous) et défnir la condition Insert All dans la table Books. Les actions pour la table Authors restent inchangées. Dans cette configuration, tous les enregistrements Book dont les auteurs existent dans la source et la base de données seront supprimés de la base de données. Avec la condition Insérer Tout définie dans la table Books, les types suivants d’enregistrements source Book seront insérés :
•Les enregistrements Book dont les auteurs existent dans la source et la base de données
•Les enregistrements Book des nouveaux auteurs qui existent uniquement dans la source
S’il existe un enregistrement source Book sans un parent, cet enregistrement Book sera aussi mappé dans la base de données et son enregistrement parent sera créé dans la table Authors. Le nouvel enregistrement Author recevra une nouvelle ID (clé primaire), et tous les autres champs recevront des valeurs NULL. Ceci est possible uniquement si tous les champs dans la table Authors, à l’exception de la clé primaire, sont nullables. Si les champs ne sont pas nullables, vous recevrez un message d’erreur disant que la contrainte NOT NULL a échoué.
De manière importante, les résultats du scénario principal et la solution alternative peuvent diverger. Par exemple, si un auteur dans la base de données a cinq enregistrements book, et si le même auteur a uniquement trois enregistrements dans la source, tous les cinq enregistrements de base de données seront supprimés et seront remplacés par trois enregistrements de la source.
Insérer une info de traçage
Quand plusieurs personnes travaillent dans la même base de données, il pourrait être une bonne idée de savoir quand le mappage a été exécuté. Il pourrait y avoir différentes possibilités : par ex., vous pouvez utiliser différentes fonctions datetime ; vous pouvez aussi fournir une instruction SQL personnalisée dans le dialogue Actions de Table de base de données. Dans notre exemple, nous ajouterons une instruction SQL suivante aux Actions pour exécuter chaque section d’enregistrement (tableAuthors) :
INSERT INTO TrackingInfo VALUES (DATETIME())
Quand vous exécutez le script SQL, cette instruction SQL sera exécutée d’abord, avant toute instruction pour les enregistrements de base de données.
Quelques autres scénarios possibles
À la place de la condition Update If, vous pouvez aussi définir l’action Delete If. Dans ce cas, les enregistrements Author et Book qui existent dans la source et la base de données seront supprimés, et les nouveaux enregistrements seront insérés dans l’action de base de données (Insert Rest). Vous pouvez aussi choisir d’ignorer les mêmes enregistrements (condition Ignore If) et d’insérer de nouveaux enregistrements dans la base de données (action Insert Rest).