Bonjour à tous,
J'ai un petit soucis avec la technique que nous avons utilisés afin que notre outil ETL n'importe que les modifications et les nouveaux ajouts dans notre entrepôt de données.
Les ajouts sont gérés via un outil de réplication, toutefois, afin d'identifier les modifications dans les tables "enfants" d'une requête nous utilisons un système de trigger qui met à jour un indicateur dans la table mère.
Un exemple de ce que j'entends par table mère / enfant:
Dans le cas ci-haut, commande est la table mère et produits_commandes la table enfant.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 select c.no_commande, p.sku, p.couleur from commande c left join produits_commande p on c.no_commande = p.no_commande;
Toutefois, dans le modèle il y a deux tables qui sont à la fois table mère/enfants dans deux dimensions. Donc, les triggers s'appelle mutuellement et ce qui bloque les deux tables avec l'erreur
Je sais que sous MSSQL l'instruction suivante existe:ORA-04091: table XXXX is mutating.
ce qui réglerait mon problème. Sinon l'autre solution que je vois est de désactiver le trigger causant problème dans l'autre table et le réactiver après la MAJ.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 ALTER DATABASE databasename SET RECURSIVE_TRIGGERS OFF
Toutefois, j'aimerais trouver une autre solution car si plusieurs transactions arrivent sur les deux tables, je risque de ne pas attraper la modification en tant que telle.
Voici le code des deux triggers :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 create or replace trigger updt_pzgs_from_ads after update on magasin for each row BEGIN update price_zone_store set sys_load_id = null where store = :new.store; END; /Merci d'avance
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 create or replace trigger updt_ads_from_pzgs after update on price_zone_store for each row BEGIN update magasin set sys_load_id = null where store = :new.store; END; /![]()
![]()
Partager