2010-10-12 7 views
1

Je travaille sur un système utilisant Oracle DB. Un outil ETL (ODI) met le déclencheur suivant sur une table pour activer la capture de données modifiée (CDC).Le déclencheur oracle ne reconnaît pas l'insertion

create or replace trigger SCHEMA.T$TABLE_NAME 
after insert or update or delete on SCHEMA.TABLE_NAME 
for each row 
declare 
    V_FLAG VARCHAR(1); 
    V_ROW_ID VARCHAR2(60); 
begin 

    if updating then 
     V_ROW_ID := :new.ROW_ID; 
     V_FLAG := 'U'; 
    end if; 

    if inserting then 
     V_ROW_ID := :new.ROW_ID; 
     V_FLAG := 'I'; 
    end if; 

    if deleting then 
     V_ROW_ID := :old.ROW_ID;  
     V_FLAG := 'D'; 
    end if; 

    insert into SCHEMA.J$TABLE_NAME 
    (
     JRN_SUBSCRIBER, 
     JRN_CONSUMED, 
     JRN_FLAG, 
     JRN_DATE, 
     ROW_ID 
    ) 
    select JRN_SUBSCRIBER, 
     '0', 
     V_FLAG, 
     sysdate, 
     V_ROW_ID 
    from SCHEMA.SNP_SUBSCRIBERS 
    where JRN_TNAME = 'SCHEMA.TABLE_NAME' 
    /* The following line can be uncommented for symetric replication */ 
    /* and upper(USER) <> upper('SCHEMA') */ 
    ; 
end; 

Mon problème est que cette chose ne reconnaît pas les mises à jour. Par exemple, quand je fais une mise à jour très simple sur une ligne, il insère toujours un 'je' dans la table CDC, signifiant qu'il a lu la mise à jour comme une insertion. Quoi de neuf? C'est quelque chose d'étrange? Je n'ai pas lu à ce sujet nulle part.

Merci d'avance!

Répondre

0

Eh bien, j'ai fini par contraindre le déclencheur à fonctionner uniquement sur les inserts. Cela a fonctionné pour mes buts.

-1

Essayez de supprimer le "pour chaque ligne" et cela devrait fonctionner.

J'ai eu le même problème que bien avant

EDIT: désolé je ne ai pas lu votre déclencheur bien .. il ne fonctionnera pas plus sans EACH ROW

Voyez ma question connexe: How to prevent an Insert Trigger from being fired when no row is inserted?

+0

Cela m'a donné quelques erreurs à propos de ne pas utiliser les: nouvelles références. Je devine que vous dites que je devrais réécrire ce déclencheur comme déclencheur de niveau d'instruction au lieu d'un déclencheur de niveau de ligne? http://psoug.org/reference/table_trigger.html – Nate

+0

oui vous avez raison, le: nouveau besoin d'un déclencheur ROW LEVEL ... (voir mon edit) – guigui42

+0

Ok, voici mon problème: j'ai besoin de la ligne Id de la rangée. Je ne pense pas que je puisse l'obtenir dans un déclencheur au niveau des déclarations, n'est-ce pas? – Nate