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:

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;
Dans le cas ci-haut, commande est la table mère et produits_commandes la table enfant.

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
ORA-04091: table XXXX is mutating.
Je sais que sous MSSQL l'instruction suivante existe:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
ALTER DATABASE databasename
SET RECURSIVE_TRIGGERS OFF
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.

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;
/
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;
/
Merci d'avance