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 10/01/2008, 15h59   #1
Invité de passage
 
Inscription : décembre 2007
Messages : 13
Détails du profil
Informations forums :
Inscription : décembre 2007
Messages : 13
Points : 4
Points : 4
Par défaut Triggers récursifs, est-ce possible ?

Je voulais savoir si il est possible de faire un insert dans un trigger qui se declenche sur une insertion exemple :

Code :
1
2
3
4
5
6
7
8
9
CREATE TRIGGER trig
AFTER INSERT ON tab
FOR EACH ROW 
BEGIN 
...
INSERT INTO tab VALUES ...
...
END
/
et si c'est possible est ce que le trigger se redéclenche de lui même aprés son INSERT INTO ?

PS : Même question avec UPDATE et DELETE.
Borni Gloim est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/01/2008, 16h02   #2
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 35

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
impossible erreur table mutante
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/01/2008, 16h12   #3
Membre éprouvé
 
Inscription : décembre 2007
Messages : 354
Détails du profil
Informations personnelles :
Localisation : France

Informations forums :
Inscription : décembre 2007
Messages : 354
Points : 408
Points : 408
Ci-après une démonstration

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
 
DROP TABLE t purge
 
DROP TABLE t succeeded.
CREATE TABLE t (a number)
 
CREATE TABLE succeeded.
CREATE TRIGGER t
before INSERT
ON t
FOR each row
when (new.a > 0)
begin
  INSERT INTO t VALUES (:new.a - 1);
end t;
 
TRIGGER t Compiled.
INSERT INTO t VALUES (5)
 
1 rows inserted
SELECT * FROM t
 
A                      
---------------------- 
0                      
1                      
2                      
3                      
4                      
5                      
 
6 rows selected
 
INSERT INTO t VALUES (100)
 
 
Error starting at line 21 IN command:
INSERT INTO t VALUES (100)
Error report:
SQL Error: ORA-00036: nombre maximum de niveaux SQL récursifs (50) dépassé.
ORA-06512: à "SCOTT.T", ligne 2
ORA-04088: erreur lors d'exécution du déclencheur 'SCOTT.T'
ORA-06512: à "SCOTT.T", ligne 2
ORA-04088: erreur lors d'exécution du déclencheur 'SCOTT.T'
ORA-06512: à "SCOTT.T", ligne 2
ORA-04088: erreur lors d'exécution du déclencheur 'SCOTT.T'
ORA-06512: à "SCOTT.T", ligne 2
ORA-04088: erreur lors d'exécution du déclencheur 'SCOTT.T'
ORA-06512: à "SCOTT.T", ligne 2
ORA-04088: erreur lors d'exécution du déclencheur 'SCOTT.T'
ORA-06512: à "SCOTT.T", ligne 2
ORA-04088: erreur lors d'exécution du déclencheur 'SCOTT.T'
ORA-06512: à "SCOTT.T", ligne 2
ORA-04088: erreur lors d'exécution du déclencheur 'SCOTT.T'
ORA-06512: à "SCOTT.T", ligne 2
ORA-04088: erreur lors d'exécution du déclencheur 'SCOTT.T'
ORA-06512: à "SCOTT.T", ligne 2
ORA-04088: erreur lors d'exécution du déclencheur 'SCOTT.T'
ORA-06512: à "SCOTT.T", ligne 2
ORA-04088: erreur lors d'exécution du déclencheur 'SCOTT.T'
ORA-06512: à "SCOTT.T", ligne 2
ORA-04088: erreur lors d'exécution du déclencheur 'SCOTT.T'
ORA-06512: à "SCOTT.T", ligne 2
ORA-04088: erreur lors d'exécution du déclencheur 'SCOTT.T'
ORA-06512: à "SCOTT.T", ligne 2
ORA-04088: erreur lors d'exécution du déclencheur 'SCOTT.T'
ORA-06512: à "SCOTT.T", ligne 2
ORA-04088: erreur lors d'exécution du déclencheur 'SCOTT.T'
ORA-06512: à "SCOTT.T", ligne 2
ORA-04088: erreur lors d'exécution du déclencheur 'SCOTT.T'
ORA-06512: à "SCOTT.T", ligne 2
00036. 00000 -  "maximum number of recursive SQL levels (%s) exceeded"
*Cause:    An attempt was made to go more than the specified number
           of recursive SQL levels.
*Action:   Remove the recursive SQL, possibly a recursive trigger.
Michel SALAIS est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/01/2008, 16h14   #4
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 35

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
ha... j'pensais il y aurait une erreur de type table mutante
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/01/2008, 16h18   #5
Invité de passage
 
Inscription : décembre 2007
Messages : 13
Détails du profil
Informations forums :
Inscription : décembre 2007
Messages : 13
Points : 4
Points : 4
Ah merci je pensais qu'il y avait peut être un moyen plus subtil de réaliser un trigger récursif car moi aussi je suis tombé sur les même erreurs que Michel SALAIS.
Bon alors trés bien merci je vais devoir recommencer mon trigger une fois de plus mais au moins j'ai appris quelque chose.
Borni Gloim est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/01/2008, 16h19   #6
Membre éprouvé
 
Inscription : décembre 2007
Messages : 354
Détails du profil
Informations personnelles :
Localisation : France

Informations forums :
Inscription : décembre 2007
Messages : 354
Points : 408
Points : 408
Citation:
Envoyé par orafrance Voir le message
impossible erreur table mutante
En fait, il y a deux points :

- Le nombre de niveaux de récursivité
- Les tables mutantes

Le deuxième problème ne concerne que les triggers "for each row" à l'exception des triggers before insert si l'instruction utilisée est "insert ... values ..."
Michel SALAIS est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/01/2008, 16h20   #7
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 35

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
l'erreur de récursivité peut être contourner avec une variable de contexte qui permettrait de savoir si on passe pour la 1° fois dans le trigger ou pas mais ça devient très vite une usine à gaz
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 17h34.


 
 
 
 
Partenaires

Hébergement Web