Prévention de trigger récursif
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:
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
Citation:
ORA-04091: table XXXX is mutating.
Je sais que sous MSSQL l'instruction suivante existe:
Code:
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:
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:
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 :) :ccool: