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 :

Utiliser un alter table dans un trigger


Sujet :

PL/SQL Oracle

  1. #1
    Membre expérimenté
    Avatar de randriano
    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 219
    Points : 1 437
    Points
    1 437
    Par défaut Utiliser un alter table dans un trigger
    Bonjour,

    J'utilise un trigger AFTER INSERT (non pas ON EACH ROW) sur une table: il utilise alors un ALTER TABLE en fonction des données insérées!!
    Le problème c'est que j'obtiens:
    ORA-04092: cannot COMMIT in a trigger

    Donc, j'ai décidé d'utiliser la directive pragma autonomous_transaction que j'ai découvert sur le net
    Maintenant le trigger et l'ALTER TABLE fonction au 1er appel mais aux autres INSERT sur la table, il y a cette erreur:
    ORA-06519: active autonomous transaction detected and rolled back
    ORA-06512: at "RANDRIANO.A_I_Mytable", line 239
    ORA-04088: error during execution of trigger 'RANDRIANO.A_I_Mytable'


    Finalement, le pragma autonomous_transaction n'était donc pas la solution ou quoi??
    randriano.dvp.com
    Développeur. Product Owner [Agile]. Sites web, mobile apps, système d'information (SI).

  2. #2
    Membre expérimenté
    Avatar de randriano
    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 219
    Points : 1 437
    Points
    1 437
    Par défaut
    Bon, j'ai oublié de mettre commit à la fin!!
    Mais en mettant commit, l'ALTER TABLE s'exécute bien mais les procédures et triggers liés de près ou de loin avec ce trigger sont invalides (avec le point rouge) mais une recompilation d'eux les rend immédiatement valide après; pour mon cas, il semble que c'est la moitié d'eux même

    REM: La table que je tente de modifier avec alter table est une table table mais pas celle qui a déclenché le trigger
    randriano.dvp.com
    Développeur. Product Owner [Agile]. Sites web, mobile apps, système d'information (SI).

  3. #3
    Membre confirmé Avatar de rvfranck
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2004
    Messages
    746
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2004
    Messages : 746
    Points : 534
    Points
    534
    Par défaut
    Alors, le problème est il resolu?
    "Celui qui reconnaît consciemment ses limites est le plus proche de la perfection." Johann Wolfgang

  4. #4
    Membre expérimenté
    Avatar de randriano
    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 219
    Points : 1 437
    Points
    1 437
    Par défaut
    Non, ça ne l'est pas encore mais je cherche toujours faute de réponses sur le forum
    Le problème c'est le fait que mes procédures sont devenues invalides avec sans erreur (point rouge sous OEM) => Comment faire pour recompiler tout ?

    Voici un résumé de mes tentatives:
    1) A_I_MYTABLE (the instruction trigger)
    ********************************
    - without pragma + commit: 1488 records in MYTABLE and procedures ok
    - with pragma + commit: 1488 records, new fields ADDED but procedures invalid

    1) A_I_ROW_MYTABLE (the line trigger) AND A_I_MYTABLE supprimé
    **************************************************
    - without pragma + commit: 1445 records in MYTABLE and subprograms ok
    - with pragma + commit: 1488 records, 1488 records, new fields ADDED but procedures invalid

    Normalement, 1488 enregistrements! (en fait, il y a un code DELETE dans le trigger selon le cas et normalement, ce n'est jamais satisfait)

    Est-ce que le truc du pragma+commit est le bon ?
    randriano.dvp.com
    Développeur. Product Owner [Agile]. Sites web, mobile apps, système d'information (SI).

  5. #5
    Membre confirmé Avatar de rvfranck
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2004
    Messages
    746
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2004
    Messages : 746
    Points : 534
    Points
    534
    Par défaut
    Citation Envoyé par randriano Voir le message
    Est-ce que le truc du pragma+commit est le bon ?
    Je pense que oui, si on veut utiliser une DDL dans un trigger DML il faut effectivement utiliser la clause "PRAGMA AUTONOMOUS TRANSACTION" et faire le "COMMIT" dans le trigger.

    Et si tu recompilais le trigger lui même!!!
    "Celui qui reconnaît consciemment ses limites est le plus proche de la perfection." Johann Wolfgang

  6. #6
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    Bizarre cette histoire du COMMIT à rajouter :

    1/ Jamais de commit dans un trigger
    2/ Une opération DDL fait un commit automatiquement
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  7. #7
    Membre confirmé Avatar de rvfranck
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2004
    Messages
    746
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2004
    Messages : 746
    Points : 534
    Points
    534
    Par défaut
    Même quand elle est dans une procedure?
    Ok, merci.
    "Celui qui reconnaît consciemment ses limites est le plus proche de la perfection." Johann Wolfgang

  8. #8
    Membre expérimenté
    Avatar de randriano
    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 219
    Points : 1 437
    Points
    1 437
    Par défaut
    J'ai enlevé le commit en mettant l'ALTER TABLE dans une procédure séparée qui sera appelée par le trigger

    Et si tu recompilais le trigger lui même!!!
    Mais le trigger est ok !!! Comment recompiler les autres?
    randriano.dvp.com
    Développeur. Product Owner [Agile]. Sites web, mobile apps, système d'information (SI).

  9. #9
    Membre confirmé Avatar de rvfranck
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2004
    Messages
    746
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2004
    Messages : 746
    Points : 534
    Points
    534
    Par défaut
    RANDRIANO si tu dis ne pas avoir d'erreur dans tes sous programmes, alors je pense que c'est un problème de dependance entre tes objets. Il va falloir que tu les compiles dans un certain ordre pour que leur statut change.

    1) Cherche dans la vue USER_DEPENDENCIES pour voir les dependances entre tes objets et recompile les (ou execute les):Si un objet X utilise un objet Y qui utilise un autre objet Z, une modification du code de Z va rendre X et Y "INVALID". Si tu recompiles X ou execute X, Y sera recompilé aussi (même Z) et tous les deux (X et Y) vont redevenir "VALID".

    Tu peux lire cette doc à partir de la page 65.

    2) Utilises tu les packages? Il est recommandé d'utiliser les packages pour encapsuler les fonctions et les procedures ainsi leur statut ne dependra que de celui la SPECIFICATION du package, tu peux donc modifier tes sous programmes dans le PACKAGE BODY sans affecter le statut des fonctions ou des procedures.
    "Celui qui reconnaît consciemment ses limites est le plus proche de la perfection." Johann Wolfgang

  10. #10
    Membre confirmé Avatar de rvfranck
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2004
    Messages
    746
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2004
    Messages : 746
    Points : 534
    Points
    534
    Par défaut
    j'avais oublié,
    Tu peux aussi utiliser l'utilitaire utldtree pour checker les dependances entre tes sous programmes.
    "Celui qui reconnaît consciemment ses limites est le plus proche de la perfection." Johann Wolfgang

  11. #11
    Membre expérimenté
    Avatar de randriano
    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 219
    Points : 1 437
    Points
    1 437
    Par défaut
    Merci pour ces trucs rvfranck !

    Mais ce que je trouve bizarre c'est que ces états invalides ne sont apparus après que j'ai utilisé pragma autonomous_transaction dans mon trigger. Visiblement, les dépendances sont correctes pour ma base
    randriano.dvp.com
    Développeur. Product Owner [Agile]. Sites web, mobile apps, système d'information (SI).

  12. #12
    Membre expérimenté
    Avatar de randriano
    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 219
    Points : 1 437
    Points
    1 437
    Par défaut
    J'ai trouvé la cause de ces procédures/triggers à l'état invalide mais qui fonctionnent (ironique)
    C'est causé en fait par le fait qu'un trigger after delete rès sollicité (déclenché dans ce trigger qui utiliser un ALTER TABLE) a généré une fois une exception toutefois capturée par un bloc EXCEPTION ... END
    Je l'ai su en résolvant ce cas et tout est devenu valide après recréation de la base
    randriano.dvp.com
    Développeur. Product Owner [Agile]. Sites web, mobile apps, système d'information (SI).

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

Discussions similaires

  1. ALTER TABLE dans un package
    Par guntzerp dans le forum Oracle
    Réponses: 2
    Dernier message: 29/06/2006, 15h40
  2. Réponses: 2
    Dernier message: 03/03/2006, 13h41
  3. Alter table dans procédure stockée
    Par mehitabelle dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 30/11/2005, 16h14
  4. Réponses: 4
    Dernier message: 30/09/2005, 13h14
  5. Problème d'alter table dans une procédure stockée
    Par Oluha dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 16/03/2005, 09h19

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