Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1386 connectés 

  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  pbm avec trigger avec fonction pour replication sur oracle

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

pbm avec trigger avec fonction pour replication sur oracle

n°1727704
NICEAN16
Posté le 02-05-2008 à 16:20:50  profilanswer
 

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

mood
Publicité
Posté le 02-05-2008 à 16:20:50  profilanswer
 

n°1727724
moi23372
Posté le 02-05-2008 à 16:58:04  profilanswer
 

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.  
 

n°1727735
NICEAN16
Posté le 02-05-2008 à 17:20:48  profilanswer
 

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!

n°1728270
moi23372
Posté le 04-05-2008 à 19:42:35  profilanswer
 

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.

n°1728372
casimimir
Posté le 05-05-2008 à 09:07:22  profilanswer
 

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/

n°1729271
NICEAN16
Posté le 06-05-2008 à 23:09:55  profilanswer
 

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

n°1729276
NICEAN16
Posté le 06-05-2008 à 23:36:33  profilanswer
 

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

n°1730452
moi23372
Posté le 10-05-2008 à 10:56:11  profilanswer
 

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;


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  pbm avec trigger avec fonction pour replication sur oracle

 

Sujets relatifs
Connexion à oracle+ listing des bases[ORACLE] probleme "if (select) is null then" SYNTAX
Questions sur OracleChangement contenu d'une page en fonction d'une liste déroulante
[ PHP ] [ RESOLU ] Envoyer des mail hotmail avec php[ASM 80x86] crée une fonction sleep.
changement d'etat cellule en fonction de la dateAide sur fonction PHP
[Résolu] Fonction count en PHPProblème en C : ma fonction recupere un '\n'
Plus de sujets relatifs à : pbm avec trigger avec fonction pour replication sur oracle


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR