Oracle replication pbm de trigger

Fermé
NICEMAN16 - 24 avril 2008 à 23:16
UaLShark Messages postés 191 Date d'inscription vendredi 19 mai 2006 Statut Membre Dernière intervention 21 juillet 2010 - 6 janv. 2009 à 08:33
Bonjour, voici mon pbm, je suis entrain de faire un programe qui fais une replication de 2 table qui ont la meme architecture et le meme nom "tab",
c'est une replication multimaitre
j'ai crée un trigger qui replique de basem administrateur repm vers bases administrateur reps et ca marche tres bien.
j'ai mis en place le meme trigger tim de reps vers repm et la ca pose probleme car il ya confusion de recursivité alors j'ai modifié le trigger tim de reps vers repm comme suite :

create trigger TIM
BEFORE insert on TAB
for each rOW
WHEN ( ID <> SELECT ID FROM TAB )
begin
insert into REPM.TAB@BM.us.oracle.com values
( :new.id ,:new.NOM,:new.PRENOM, :new.NE_LE );
END IF;
end ;
/

je me suis basé sur l'idée de l'insertion seulement si l''id' n'existe pas pour evité la recursivité mais voici le msg d'erreur:

WHEN ( ID <> SELECT ID FROM TAB )
*
ERREUR à la ligne 4 :
ORA-00936: Expression absente

si vous pouvez m'aider a résoudre ca je serai reconnaissant, merci d'avance.

4 réponses

UaLShark Messages postés 191 Date d'inscription vendredi 19 mai 2006 Statut Membre Dernière intervention 21 juillet 2010 35
25 avril 2008 à 10:47
ok ,
WHEN ( ID <> SELECT ID FROM TAB ) c'est pas un syntax correct je crois.
en plus tab est un mot reservé d'oracle c'est une vue qui contient les tables et les vues du current user essaie stp de modifier ce nom de table!
après voilà le code que je te propose : //Je suppose que que id est un number à toi de modifier !

create trigger TIM
BEFORE insert on TABXX
for each rOW
count_id number;
begin
select count(1) into count_id from TABXX where TABXX.id = :new.id;
if (count_id = 0 ) then
insert into REPM.TAB@BM.us.oracle.com values
( :new.id ,:new.NOM,:new.PRENOM, :new.NE_LE );
END IF;
end ;
/
0
merci je croi que ca va marcher je te tiendrai au courant merci encore.
0
c.robertleroy
16 mai 2008 à 17:11
Je cherche à faire une mise à jour d'un champs d'une table [PROFESSEUR] lors de la mise à jour de cette même table.

En clair je souhaite faire une concaténation de champs dans un champs dans la même table.

p.Texte_Adresse = p.Adresse + ' ' + p.CP+ ' ' + p.Ville

Puisque je modifie un enregistrement qui vient d'être modifié (puisque le trigger vient d'être lancé) cela ne va t-il pas partir en boucle ?

Avez-vous une préconisation ?
0
UaLShark Messages postés 191 Date d'inscription vendredi 19 mai 2006 Statut Membre Dernière intervention 21 juillet 2010 35 > c.robertleroy
1 janv. 2009 à 19:29
Si tu travailles avec Oracle
create or replace trigger MON_TRG after INSERT ON PROFESSEUR FOR EACH ROW
begin
TextAdresse := Adresse||' '||to_char(cp)||' '||ville;
end ;
0
Le problème vient du fait que dans un trigger si vous modifier l'enregistrement qui déclenche le trigger vous relancer le trigger.
L'astuce est d'après ce que l'on m'a dit :
- Faire un trigger sur certain champs de la table sur modification de ces champs
- Dans le trigger modifier un autre champ.


Christian
0
UaLShark Messages postés 191 Date d'inscription vendredi 19 mai 2006 Statut Membre Dernière intervention 21 juillet 2010 35
6 janv. 2009 à 08:33
Bonjour,
Exactement, dans le cas de modification d'un enregistrement qui n'est pas encore validé oracle génère une erreur 'Table Mutating'.
J'ajouterais dans le cas des update, il faut eviter les triggers circulaires (des tables dependantes ou l'une met à jour l'autre)
0