pbm avec trigger avec fonction pour replication sur oracle

pbm avec trigger avec fonction pour replication sur oracle - SQL/NoSQL - Programmation

Marsh Posté le 02-05-2008 à 16:20:50    

bjr a tous  
je veux cree un trigger 'TIM' qui me permet de faire une replication d'1 base de donnée 'BM' a une autre 'BS'.
alors voila pour cela je me suis trouvé dans un pbm de recursivité, j'ai changer mon trigger pour qu'il fais la test dans ma table 'TAB' s'il ne trouve pas l'ID il fais l'insertion et la je me suis trouvé dans un probleme de table mutante.
j'ai cree alors une fonction qui fais le test a la place du trigger et lui retourne une valeur seulement l'insertion se fais que d'un coté. voila le trigger et la fonction, pour mieu comprendre les 2 table sont 'TAB' et les trigger 'TIM' ca gange que dans le dblink.
 
CREATE OR REPLACE FUNCTION RECHERCHE_SI_EXIST (ID NUMBER)
return NUMBER IS count_id NUMBER;
PRAGMA AUTONOMOUS_TRANSACTION;
begin
select 1 into count_id from TAB where TAB.id = id;
RETURN count_id;
end;
/
 
 
create trigger TIM
after insert on TAB
for each rOW
DECLARE count_id NUMBER;
begin
count_id := RECHERCHE_SI_EXIST (:NEW.ID);
if (count_id < 1 ) then
insert into REPM.TAB@BM.us.oracle.com values
( :new.id ,:new.NOM,:new.PRENOM, :new.NE_LE );
END IF;
end;
 
merci d'avance...
 
Configuration: Windows XP
Firefox 2.0.0.14

Reply

Marsh Posté le 02-05-2008 à 16:20:50   

Reply

Marsh Posté le 02-05-2008 à 16:58:04    

c'est complétement abérant ce que tu proposes la.
 
Donc, tu insères dans ta table TAB.  
Tu as un trigger sur cette table en AFTER INSERT.  
 
Ensuite, dans ce trigger, tu recherches si l'élément à été correctement ajouté? Dit moi, ça sert à quoi cela? Si cela n'a pas correctement été ajouté, alors tu ne passerais même pas dans le AFTER INSERT.  
 
Donc conclusion, c'est tout à fait normale que tu passes dans un MUTATING TABLE car ton opération ne sert strictement à rien à n'a pas lieu d'exister. Dit moi quel est l'intéret de faire une query sur cette table pour rechercher l'id que tu viens d'insérer. Excuse moi ça ne sert à rien.  
 
Don ce que je te suggère, c'est de sucrer ton opération de recherche si existe qui ne sert tout simplement à rien.  
 
si tu passe dans l'AFTER INSERT, c'est que l'insertion dans ton schéma local s'est correctement effectué. Donc, tu peux insérer directement dans ton schémas distant via ton DBLINK.  
 

Reply

Marsh Posté le 02-05-2008 à 17:20:48    

reslt, mon ami moi23372, ce que je voulé faire c'est une replication via les trigger alors je suis parti du l'idée de faire un teste dans ma table qui vérifi si 'id' existe pour evité la recursivité alors voila j'ai changer le trigger et suprimé la fonction et j'ai cree une autre table ca donnée ca :
 
declare a number;  
begin  
select nb into a from repm.table_temp where repm.table_temp.nb=1;
if a < :new.id then  
insert into REPS.TAB@BS.us.oracle.com values
( :new.id ,:new.NOM,:new.PRENOM, :new.NE_LE );
insert into repm.table_temp values ( :new.id , :new.id );
end if;
EXCEPTION
WHEN NO_DATA_FOUND THEN
insert into repm.table_temp values ( :new.id , :new.id );
insert into REPS.TAB@BS.us.oracle.com values
( :new.id ,:new.NOM,:new.PRENOM, :new.NE_LE );
end;
 
mais le probleme ce pose tjrs!

Reply

Marsh Posté le 04-05-2008 à 19:42:35    

ah je vois.  
A ta place, plutot que de faire un SELECT je ferais un INSERT.  
 
Mais fait gaffe, il faut que tu traites l'exception DUP_VAL_ON_INDEX qui te spécifiera que l'enregistrement existe déjà.  
 
Contrairement au IF avce ta sélection, déclencher une exception est beaucoup plus rapide.

Reply

Marsh Posté le 05-05-2008 à 09:07:22    

si c'est juste pour une table cela ne sert sans doute a rien de se lancer la dedans, mais sinon oracle a prévu un système de réplication: http://fadace.developpez.com/oracle/downstreams/

Reply

Marsh Posté le 06-05-2008 à 23:09:55    

MERCI POUR L'INFO? MAIS OU DOIS JE ECRIRE CETTE INSTRUCTION ?
DUP_VAL_ON_INDEX  
MERCI ENCORE

Reply

Marsh Posté le 06-05-2008 à 23:36:33    

oui mais tu veux bien m'aider un peut? pour réecrire mon scripte

Reply

Marsh Posté le 10-05-2008 à 10:56:11    

dans le blog d'exception au même niveau les autres exceptions
 
...
EXCEPTION
   WHEN NO_DATA_FOUND THEN RAISE_APPLICATION_ERROR(-2000,'Pas de data trouvé');
   WHEN DUP_VAL_ON_INDEX THEN RAISE_APPLICATION_ERROR(-20001,'La ligne que vous tenté d'inséré existe déjà');
   WHEN OTHERS THEN RAISE;
END;

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed