Académique Documents
Professionnel Documents
Culture Documents
com/articles/single/6409-mise-place-etl
Accéder à Open-Campu
ACCUEIL CURSUS COURS ADMISSIONS CAMPUS DOCUMENTATION ANCIENS ENTREPRISES LIBRAIRIES PUBLICATIONS Naviguer sur la page
ACCUEIL CURSUS COURS ADMISSIONS CAMPUS DOCUMENTATION ANCIENS ENTREPRISES LIBRAIRIES PUBLICATIONS
Introduction
L’informatique décisionnelle ou encore la Business Intelligence (BI) est
ACCUEIL CURSUS COURS ADMISSIONS CAMPUS DOCUMENTATION ANCIENS ENTREPRISES LIBRAIRIES PUBLICATIONS Naviguer sur la page
différents moyens, outils et méthodes qu’offre cette technologie, elle permet
de collecter, consolider et restituer les données sous divers formats : rapports,
tableaux de bord, etc…
Introduction
L’objectif de cet article est d’organiser le transfert des données d’une base test Mises-en œuvre des fonctions ETL
source nommé Emode sur Oracle 11G vers une base destination Emode sur
SQL Server 2016 grâce aux fonctions ETL.
Cet article permettra d’expliquer en détail, code source à l’appui les différentes étapes de la conception du projet. Dans un premier
temps j’expliquerai comment j’ai mis en œuvre la vérification (qualité et intégrité) des données à l’aide des requêtes SQL, puis expliquer
les opérations de transferts de données d’Oracle vers SQL Server avec la création de packages que propose SQL Server Intégration
Services, outil de SQL Server Business Intelligence Development Studio 2016.
Le schéma de la base Oracle sur lequel se base le projet ne présente aucune contrainte ni de clé primaire ni de clé étrangère. Ainsi il
peut exister des doublons, de données n’existant dans la table de dimension mais présentes dans la table de faits. Le but de notre
vérification est d’identifier ces données et de les rejeter dans des tables appelées tables de rejet.
J’ai vérifié à l’aide de requête SQL, pour chaque table de la base, l’unicité des clés primaires sur les colonnes correspondantes de nos 4
tables de dimensions (Article_Color_lookup, Article_Lookup, Calendar_Year_Lookup, Outlet_Lookup) et la table de faits (Shop_Facts). J’ai
ACCUEIL CURSUS COURS ADMISSIONS CAMPUS DOCUMENTATION ANCIENS ENTREPRISES LIBRAIRIES PUBLICATIONS Naviguer sur la page
Figure 1. Model relationnel de la base Emode
ACCUEIL CURSUS COURS ADMISSIONS CAMPUS DOCUMENTATION ANCIENS ENTREPRISES LIBRAIRIES PUBLICATIONS Naviguer sur la page
select
count(*) AS TOTAL_COUNT --211
,count(distinct article code) AS DISTINCT_VALUE_COUNT --211
from ARTICLE LOOKUP;
select
count(*) AS TOTAL_COUNT --663
,count(distinct concat(to_char(article_code),to_char(color_code))) AS DISTINCT VALUE COUNT --661
from
ARTICLECOLORLOOKUP;
select
count(*) AS TOTAL_COUNT --262
,count(distinct week_key) AS DISTINCT VALUE COUNT --262
from
CALENDAR_YEAR_LOOKUP;
select
count(*) AS TOTAL_COUNT --13
,count(distinct shop_code) AS DISTINCT_VALUE_COUNT --13
from
OUTLET LOOKUP;
select
count(*) AS TOTAL_COUNT —89171
,count(distinct id) AS DISTINCT_ VALUE_ —89171
from
shop facts ;
ACCUEIL CURSUS COURS ADMISSIONS CAMPUS DOCUMENTATION ANCIENS ENTREPRISES LIBRAIRIES PUBLICATIONS Naviguer sur la page
Ces données ne seront pas supprimées mais, seront simplement transférées dans les tables de rejet que nous créons à cet effet.
Pour être clé étrangère d’une table, toutes les valeurs d’une colonne doivent exister dans la table correspondante. Pour chacune de nos
tables de dimension, il faut vérifier que les clés étrangères présentes dans la table de faits existent comme clé primaire dans les tables
de dimension.
Le code SQL ci-dessous montre comment procéder pour la vérification :
select
count( distinct concat(to_char(article_code),to_char(color_code))) ,article code
,article code
,color code
from
SHOP FACTS
where
concat (tochar(article code),to_char(color code)) not in
(
select
concat(to char(article code),to_char(color code))
from
ARTICLE COLOR LOOKUP
)
group by
article code
,color code
;
ACCUEIL CURSUS COURS ADMISSIONS CAMPUS DOCUMENTATION ANCIENS ENTREPRISES LIBRAIRIES PUBLICATIONS Naviguer sur la page
table afin de conserver une trace de ces données. Il faut noter que les différentes tables de rejet créées reprennent exactement les
mêmes colonnes que nos tables d’origine.
Ci-dessous le script de création de table de rejet correspondante à la table Article_Color_Lookup.
ACCUEIL CURSUS COURS ADMISSIONS CAMPUS DOCUMENTATION ANCIENS ENTREPRISES LIBRAIRIES PUBLICATIONS Naviguer sur la page
J’ai développé différents packages pour le transfert des données de la base de données Oracle vers SQL Server. Les différentes
fonctionnalités de ces packages sont expliquées dans la suite.
Ce package permet de transférer la totalité des données du schéma Emode d’Oracle vers celui de SQL Server. Cela implique les
conditions suivantes :
Pour vider les données dans la base Emode de SQL Server dont les tables présentes des contraintes entre elles, j’ai choisi de supprimer
d’abord les données dans les tables statiques avant de supprimer celles des tables dynamiques (table contenant des clés étrangères).
Une autre solution possible aurait été de supprimer les contraintes référentielles dans toutes les tables d’Emode sur SQL Server avant de
vider les données et ensuite rétablir ces contraintes.
Ce package nécessite deux connexions : une à la base Oracle et l’autre à la base SQL Server. Après avoir vidé les données, le transfert des
données est assuré d’abord vers les tables de dimensions et ensuite vers la table de faits. Ce package se termine par le package 4 qui est
celui des agrégats.
ACCUEIL CURSUS COURS ADMISSIONS CAMPUS DOCUMENTATION ANCIENS ENTREPRISES LIBRAIRIES PUBLICATIONS Naviguer sur la page
SELECT
count(tochar(article_code)||tochar(color_code)) as nb
ACCUEIL CURSUS COURS ADMISSIONS CAMPUS DOCUMENTATION ANCIENS ENTREPRISES LIBRAIRIES PUBLICATIONS Naviguer sur la page
HAVING
count(tochar(article_code)||tochar(color_code)) = 1;
ACCUEIL CURSUS COURS ADMISSIONS CAMPUS DOCUMENTATION ANCIENS ENTREPRISES LIBRAIRIES PUBLICATIONS Naviguer sur la page
ACCUEIL CURSUS COURS ADMISSIONS CAMPUS DOCUMENTATION ANCIENS ENTREPRISES LIBRAIRIES PUBLICATIONS Naviguer sur la page
ID
, ARTICLE_CODE
, COLOR_CODE
, WEEK KEY
, SHOP CODE
, MARGIN
, AMOUNT_SOLD
, QUANTITY_SOLD
FROM
SHOP_FACTS sf
WHERE
(ID IN
(SELECT ID
FROM SHOP_FACTS sfl
GROUP BY ID
HAVING (COUNT(ID) = 1)))
and
(concat(article_code, color_code) in
(select concat(article_code, color_code) from ARTICLE_COLOR_LOOKUP acl1
group by article_code, color_code
having (count(concat(article code, color_code)) = 1) ))
and
(
article_code in (
select article_code from article_lookup all
group by article code having (count(article code) =1)
)
)
and
(
shop_code in (
select shop_code from outlet_lookup of
group by shop code having (count(shopcode)=1
)
)
and
(
week_key in (
select week_key from calendar_year_lookup cl
group by week_key having (count(weekkey)= 1)
)
);
ACCUEIL CURSUS COURS ADMISSIONS CAMPUS DOCUMENTATION ANCIENS ENTREPRISES LIBRAIRIES PUBLICATIONS Naviguer sur la page
ACCUEIL CURSUS COURS ADMISSIONS CAMPUS DOCUMENTATION ANCIENS ENTREPRISES LIBRAIRIES PUBLICATIONS Naviguer sur la page
Pour ce faire, il a fallu créer sur Oracle un second schéma nommé Emode_inc. Emode_inc nous permet de stocker tout changement
effectué dur les tables de la base Emode sur Oracle.
connect / as sysdba
Create user emode inc
Identified by emodeinc;
Grant connect, resource to emodeinc;
On retrouve dans Emode_inc les mêmes tables de dimensions et de fait que dans Emode.
ACCUEIL CURSUS COURS ADMISSIONS CAMPUS DOCUMENTATION ANCIENS ENTREPRISES LIBRAIRIES PUBLICATIONS Naviguer sur la page
-- article_color_lookup
--insertion
create or replace TRIGGER tri_article_color_lookup_ins AFTER INSERT ON
article_color_lookup FOR EACH ROW
declare type_op char(1) := 'i';
BEGIN
INSERT INTO ARTICLE_COLOR_LOOKUP_INC VALUES(:NEW.ARTICLE_CODE, :NEW.COLOR_CODE, :NEW.ARTICLE LABEL,
:NEW.COLOR_LABEL, :NEW.CATEGORY, :NEW.SALE_PRICE, :NEW.FAMILY_NAME, :NEW.FAMILY_CODE, type_op);
END;
--update
create or replace TRIGGER tri_article_color_lookup_upd AFTER UPDATE ON
article_color_lookup FOR EACH ROW
declare type_op char(i) := 'u';
BEGIN
INSERT INTO ARTICLE_COLOR_LOOKUP_INC VALUES(:NEW.ARTICLE_CODE, :NEW.COLOR_CODE, :NEW.ARTICLE_LABEL,
:NEW.COLOR_LABEL, :NEW.CATEGORY, :NEW.SALE_PRICE, :NEW.FAMILY_NAME, :NEW.FAMILY_CODE, type_op);
END;
--delete
create or replace TRIGGER tri_article_color_lookup_del BEFORE DELETE ON
article_color_lookup FOR EACH ROW
declare type_op char(=) := d;
BEGIN
INSERT INTO ARTICLE_COLOR_LOOKUP_INC VALUESOOLD.ARTICLE_CODE, :OLD.COLOR_CODE, :OLD.ARTICLE_LABEL,
:OLD.COLOR_LABEL, :OLD.CATEGORY, :OLD.SALE_PRICE, :OLD.FAMILY_NAME, :OLD.FAMILY_CODE, type_op);
END;
ACCUEIL CURSUS COURS ADMISSIONS CAMPUS DOCUMENTATION ANCIENS ENTREPRISES LIBRAIRIES PUBLICATIONS Naviguer sur la page
Pour assurer la traçabilité manuelle des transferts, j’ai créé des tables d’audit qui sont intégré au package. Ce mécanisme me permet
d’avoir les statistiques sur les transferts effectués : les raisons sur un rejet de données, le statut et la date d’un transfert.
Pour cela j’ai créé deux tables d’audit :
Man_audit_load qui contient toutes les informations concernant le transfert : la date de début, le statut du transfert (ok pour un transfert
sans encombre)
Man_audit_error comme son nom l’indique regroupe l’ensemble des informations sur des erreurs de transferts
Déroulement du package
Ce deuxième package nécessite deux connexions : l’une à la base Oracle (Emode_inc) et l’autre à la base SQL Server(Emode). Le
package s’exécute en différentes étapes. La stratégie de transfert est telle que les données des tables de dimensions sont d’abord
chargées avant de se faire sur la table de faits.
ACCUEIL CURSUS COURS ADMISSIONS CAMPUS DOCUMENTATION ANCIENS ENTREPRISES LIBRAIRIES PUBLICATIONS Naviguer sur la page
Emode_inc.
Le principe du transfert reste le même au niveau de toutes les tables. Nous nous intéressons ici à celui de la table
Article_Color_Lookup_inc (Emode_inc d’Oracle) vers la table Article_Color_Lookup (Emode de SQL Server).
Figure 6. Figure 6:Data flow Article_color_lookup_inc
ACCUEIL CURSUS COURS ADMISSIONS CAMPUS DOCUMENTATION ANCIENS ENTREPRISES LIBRAIRIES PUBLICATIONS Naviguer sur la page
ACCUEIL CURSUS COURS ADMISSIONS CAMPUS DOCUMENTATION ANCIENS ENTREPRISES LIBRAIRIES PUBLICATIONS Naviguer sur la page
et de complexité. Pour y répondre j’ai utilisé la solution offerte par SSIS avec des audits automatiques dans notre package 3. Ce dernier
est très semblable au précédent à la différence qu’on intègre des fonctions automatiques que propose SSIS en ce qui concerne la gestion
des erreurs et le mécanisme d’audit.
Figure 7. Figure 7:Control flow Package 3
ACCUEIL CURSUS COURS ADMISSIONS CAMPUS DOCUMENTATION ANCIENS ENTREPRISES LIBRAIRIES PUBLICATIONS Naviguer sur la page
Ci-dessous le contenu du data flow d’Article_color_lookup_inc. Le principe reste le même pour les autres tables.
Figure 8. Figure 8:Data flow Article_color_lookup_inc
ACCUEIL CURSUS COURS ADMISSIONS CAMPUS DOCUMENTATION ANCIENS ENTREPRISES LIBRAIRIES PUBLICATIONS Naviguer sur la page
ACCUEIL CURSUS COURS ADMISSIONS CAMPUS DOCUMENTATION ANCIENS ENTREPRISES LIBRAIRIES PUBLICATIONS Naviguer sur la page
chargée des bonnes données. « Multicast » permet de dupliquer le flux et nous effectuons alors deux traitements en parallèle. Grâce à
un « Conditional Split » le flux est divisé en trois en fonction du champ type_op. Les trois flux sont traités en parallèle, un pour
l’insertion, un pour la modification et le dernier pour la suppression.
Les modifications validant toutes les contraintes sont dirigées vers un « OLE DB Command » qui exécute ensuite une requête SQL
paramétrée, soit INSERT INTO soit UPDATE soit DELETE dans la table du schéma Emode sur SQL Server. Si cette requête a réussi, alors la
modification a bien été prise en compte, sinon un flux d’erreur est créé et les trois flux d’erreurs sont réunis par la suite dans un unique
flux grâce à un « Union All » afin d’être transféré dans une table Audit_error créée à cet effet. Elle contient les informations suivantes :
nom de la table, valeur de la clé primaire, informations sur la source du problème.
Il est question dans ce package de réaliser après chaque modification de la base de données la mise à jour des tables d’agrégats. Cela
passe par une suppression des données des tables (Emode SQL Server) par « Truncate » suivi d’une insertion en utilisant les nouvelles
données. Ce package nécessite deux connexions : une sur Oracle et une autre sur SQL Server.
Figure 9. Figure 9:Package 4
ACCUEIL CURSUS COURS ADMISSIONS CAMPUS DOCUMENTATION ANCIENS ENTREPRISES LIBRAIRIES PUBLICATIONS Naviguer sur la page
truncate table AGG_YR_FP_YW_TI_RV_MA_QT;
truncate table AGG_YR_FP_YW_MO_TI_RV_MA_QT;
ACCUEIL CURSUS COURS ADMISSIONS CAMPUS DOCUMENTATION ANCIENS ENTREPRISES LIBRAIRIES PUBLICATIONS Naviguer sur la page
,CL.MONTH_NAME
order by
CL.WEEK KEY ASC;
Exécution immédiate
Tâche planifiée au niveau du système d’exploitation
Automatisation en utilisant SQL Agent
Dans la suite nous présentons ces différentes façons.
Exécution immédiate
Nous avons à notre disposition un dossier contenant tous les packages que l’on reconnait avec l’extension .dtsx. Il suffit donc de
procéder à une exécution immédiate du package et on obtient la fenêtre.
Figure 10. Figure 10:Fenêtre Exécution immédiate Package 1
ACCUEIL CURSUS COURS ADMISSIONS CAMPUS DOCUMENTATION ANCIENS ENTREPRISES LIBRAIRIES PUBLICATIONS Naviguer sur la page
Il est également possible de se passer de l’interface graphique et d’utiliser l’outil en ligne de commandes dtexec. Pour cela il faut créer un
ACCUEIL CURSUS COURS ADMISSIONS CAMPUS DOCUMENTATION ANCIENS ENTREPRISES LIBRAIRIES PUBLICATIONS Naviguer sur la page
"C:\Program Files (x86)\Microsoft SQL Server\130\DTS\Binn\DTExec.exe" /DECRYPT groupe05 /f "C:\Users\Administrator\Desktop\BD51_Projet\Transfert_Emode_Oracle_to_SQLServer.dtsx"
echo EXECUTING Transfert_Emode_Oracle_to_SQLServer PACKAGE
echo Check logs file
echo.
pause
Une autre possibilité d’automatisation est de passer par la mise en place d’une tâche planifiée. Pour cela, il faut suivre les instructions
suivantes :
Aller dans All programs >Accessories>System Tools>Scheduled Tasks. Ci-dessous les différentes taches créées, il faut renseigner, pour
chaque table le fichier batch qui correspond à l’exécution d’une tâche.
Figure 11. Figure 11: Tâche planifiée.
ACCUEIL CURSUS COURS ADMISSIONS CAMPUS DOCUMENTATION ANCIENS ENTREPRISES LIBRAIRIES PUBLICATIONS Naviguer sur la page
ACCUEIL CURSUS COURS ADMISSIONS CAMPUS DOCUMENTATION ANCIENS ENTREPRISES LIBRAIRIES PUBLICATIONS Naviguer sur la page
ACCUEIL CURSUS COURS ADMISSIONS CAMPUS DOCUMENTATION ANCIENS ENTREPRISES LIBRAIRIES PUBLICATIONS Naviguer sur la page
ACCUEIL CURSUS COURS ADMISSIONS CAMPUS DOCUMENTATION ANCIENS ENTREPRISES LIBRAIRIES PUBLICATIONS Naviguer sur la page
ACCUEIL CURSUS COURS ADMISSIONS CAMPUS DOCUMENTATION ANCIENS ENTREPRISES LIBRAIRIES PUBLICATIONS Naviguer sur la page
Il est également possible d’utiliser SQL Server Agent pour mettre en place l’automatisation des packages. Il faut modifier la propriété
ProtectionLevel autant sur les propriétés du projet et sur les package et le mettre EncryptWithPassword et spécifier un mot de passe,
pour permettre à tout utilisateur dont SQLAgent$SQL2016(utilisateur par défaut sql agent), qui veut exécuter le package de le faire avec
l’option /DECRYPT <motdepasse>
Une fois ces deux éléments créés, il faut procéder à la création des jobs en mettant la commande
ACCUEIL CURSUS COURS ADMISSIONS CAMPUS DOCUMENTATION ANCIENS ENTREPRISES LIBRAIRIES PUBLICATIONS Naviguer sur la page
A propos de SUPINFO | Contacts & adresses | Enseigner à SUPINFO | Presse | Conditions d'utilisation & Copyright | Respect de la vie privée | Investir
ACCUEIL CURSUS COURS ADMISSIONS CAMPUS DOCUMENTATION ANCIENS ENTREPRISES LIBRAIRIES PUBLICATIONS Naviguer sur la page