IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PL/SQL Oracle Discussion :

Triggers récursifs, est-ce possible ?


Sujet :

PL/SQL Oracle

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 13
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  2. #2
    Expert éminent
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    impossible erreur table mutante

  3. #3
    Membre chevronné
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    354
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 354
    Par défaut
    Ci-après une démonstration

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  4. #4
    Expert éminent
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    ha... j'pensais il y aurait une erreur de type table mutante

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 13
    Par défaut
    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.

  6. #6
    Membre chevronné
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    354
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 354
    Par défaut
    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 ..."

  7. #7
    Expert éminent
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    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

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Trigger : c'est possible ?
    Par ragu23 dans le forum PL/SQL
    Réponses: 4
    Dernier message: 09/03/2011, 11h34
  2. Réponses: 7
    Dernier message: 05/05/2008, 13h39
  3. trigger sur select : est-ce possible ?
    Par yosraisi dans le forum Langage SQL
    Réponses: 3
    Dernier message: 01/03/2008, 23h18
  4. Réponses: 2
    Dernier message: 08/06/2007, 11h11
  5. [CR] Est il possible de créer des univers avec Seagate Info?
    Par Frank dans le forum SAP Crystal Reports
    Réponses: 1
    Dernier message: 27/06/2002, 15h22

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo