Précédent   Forum des professionnels en informatique > Bases de données > Oracle > PL/SQL
PL/SQL Forum d'entraide sur le PL/SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 31/08/2007, 13h37   #1
Membre régulier
 
Inscription : juillet 2005
Messages : 93
Détails du profil
Informations forums :
Inscription : juillet 2005
Messages : 93
Points : 74
Points : 74
Par défaut Trigger avec update sur même table

Bonjour

Je souhaiterai savoir s'il est possible, sous Oracle 9i, de créer un trigger s'exécutant suite à un update ou un insert et mettant à jour une colonne de cette même table (par un update) sans déclencher de boucle...ou en la controlant...

Merci, Thig
Thig est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/08/2007, 13h52   #2
Membre actif
 
Avatar de Loyd1974
 
Inscription : août 2007
Messages : 176
Détails du profil
Informations forums :
Inscription : août 2007
Messages : 176
Points : 172
Points : 172
Il faut créer un trigger BEFORE INSERT OR UPDATE, si tu veux modifier la ligne en cours d'insertion/modification.
Du style, tu auras un code du style : (euh, c'est un exemple à ne pas prendre à la lettre, c'est l'idée qui est importante)
Code :
1
2
3
4
 
IF :old.date_derniere_modification < sysdate then
   :new.date_derniere_modification := sysdate;
end IF;
Par contre, je crois avoir souvenir qu'on ne peut pas à partir d'un trigger d'une table modifié une autre ligne que celle en cours sur la même table (mais c'est un souvenir de 8i, cela a peut être changé depuis)
Loyd1974 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/08/2007, 14h09   #3
Membre régulier
 
Inscription : juillet 2005
Messages : 93
Détails du profil
Informations forums :
Inscription : juillet 2005
Messages : 93
Points : 74
Points : 74
Merci, pour ta réponse

Pour que je comprenne bien :

Si je fais un update sur la colonne x de ma table, le trigger update se déclenche avant que la modif soit réellement faite sur la colonne x ...

et je peux en profiter pour modifier la valeur d'une autre colonne y pour la même ligne en faisant dans le trigger qlq chose comme :

:new.y := ma_nouvelle_valeur

et j'empêche la boucle en faisant un test sur par exemple une date de modif

c'est bien ca ?

on peut dire que :

new.y = sysdate <=> update table set y = sysdate where ...

et sa déclenche aussi le trigger ?

Merci
Thig est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/08/2007, 14h27   #4
McM
Expert Confirmé Sénior
 
Inscription : juillet 2003
Messages : 3 450
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 3 450
Points : 4 209
Points : 4 209
Non, ce n'est pas une instruction UPDATE.
C'est modifier l'enregistrement. Ca ne va pas redéclencher un trigger.
__________________
More Code : More Bugs. Less Code : Less Bugs
McM est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/08/2007, 14h32   #5
Membre régulier
 
Inscription : juillet 2005
Messages : 93
Détails du profil
Informations forums :
Inscription : juillet 2005
Messages : 93
Points : 74
Points : 74
Donc, j'ai pas besoin du test :

if :old.date_derniere_modification < sysdate then ...

pour empêcher la boucle, c'est bien ça ?
Thig est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/08/2007, 14h36   #6
McM
Expert Confirmé Sénior
 
Inscription : juillet 2003
Messages : 3 450
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 3 450
Points : 4 209
Points : 4 209
Oui, c'est ça, tu n'aura pas de boucle.
__________________
More Code : More Bugs. Less Code : Less Bugs
McM est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/08/2007, 14h44   #7
Membre actif
 
Avatar de Loyd1974
 
Inscription : août 2007
Messages : 176
Détails du profil
Informations forums :
Inscription : août 2007
Messages : 176
Points : 172
Points : 172
Citation:
Envoyé par Thig Voir le message
Donc, j'ai pas besoin du test :

if :old.date_derniere_modification < sysdate then ...

pour empêcher la boucle, c'est bien ça ?
Edit: J'ai mal lu ta réponse, effectivement tu n'as pas besoin du test
non, je t'ai induit en erreur avec ma ligne de code, ce n'est pas le test en lui-même qui empêche la boucle, c'est le trigger before update en lui-même

Cela se passe ainsi :
  1. Envoie de la requête INSERT/UPDATE par l'utilisateur
  2. Pour chaque ligne à insérer/modifier, le trigger BEFORE INSERT OR UPDATE est lancé
  3. Exécution du code contenu dans le trigger
  4. La ligne est inséré/modifié bel et bien dans la table
Donc, si par exemple tu as la colonne A qui est calculé par B+C dans ton trigger, lorsque tu fais :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
 
INSERT INTO MyTable
(B,C)
VALUES
(X,Y)
 
Le comportement de ton TRIGGER sera identique à
INSERT INTO MyTable
(A,B,C)
VALUES
(X+Y, X, Y)
 
Il n'y aura qu'une seule insertion, donc qu'un seul déclenchement du trigger
Note que le déclenchement peut être effectué pour chacune des lignes ou bien pour la requête en entier. Ce dernier cas peut être utilisé pour faire de l'audit ou des traces, par exemple, tu peux avoir un trigger BEFORE DELETE définit au niveau du statement qui enregistre l'heure et le user qui a fait le delete dans une autre table. Même si le delete efface plusieurs ligne, le trigger sera exécuté une seule et unique fois (par contre dans ce cas, le trigger sera exécuté même si aucune ligne n'est effacé, à l'inverse du trigger sur chaque ligne qui n'est déclenché uniquement si au moins une ligne est effacée/insérée/modifiée
Loyd1974 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/08/2007, 14h45   #8
Membre régulier
 
Inscription : juillet 2005
Messages : 93
Détails du profil
Informations forums :
Inscription : juillet 2005
Messages : 93
Points : 74
Points : 74
Mais c'est superbe !

Merci, A+ Thig
Thig est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 23h54.


 
 
 
 
Partenaires

Hébergement Web