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

SQL Oracle Discussion :

Tigger afer update


Sujet :

SQL Oracle

  1. #1
    Membre du Club
    Inscrit en
    Août 2009
    Messages
    273
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 273
    Points : 46
    Points
    46
    Par défaut Tigger afer update
    Bonjour,

    Je cherche à créer un trigger sur une table qui incrémente la valeur d'un champs sur un enregistrement donné après chaque modification.

    Merci!

  2. #2
    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
    Tu fais un TRIGGER BEFORE UPDATE FOR EACH ROWS
    Et dans le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    :new.compteur := NVL(:old.compteur,0) + 1;

  3. #3
    Membre du Club
    Inscrit en
    Août 2009
    Messages
    273
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 273
    Points : 46
    Points
    46
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    CREATE OR REPLACE TRIGGER trigger_name
        AFTER UPDATE ON table_name
        FOR EACH ROW
    DECLARE
        v_champs1         	table_name.champs1%TYPE;
     
    BEGIN
    :new.champs1:= NVL(:old.champs1,0) + 1;
    END;
    Ne devrais-je pas faire aussi un update sur ce champs comme ceci ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    BEGIN
    :new.champs1:= NVL(:old.champs1,0) + 1;
     
    update table_name
    set champs1 = :new.champs1
    where id = v_id (que je déclare ?)
    END;

  4. #4
    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
    Houla surtout pas malheureux !

    Il va falloir que tu regardes une doc sur les triggers (je ne sais pas s'il y en a dans les tutoriels)

    Le premier code est quasi juste :
    C'est BEFORE et v_champs1 ne sert à rien et pas de DECLARE
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    CREATE OR REPLACE TRIGGER trigger_name
        BEFORE UPDATE ON table_name
        FOR EACH ROW
    BEGIN
    :new.champs1:= NVL(:old.champs1,0) + 1;
    END;

  5. #5
    Membre du Club
    Inscrit en
    Août 2009
    Messages
    273
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 273
    Points : 46
    Points
    46
    Par défaut
    En fait je voudrais pouvoir dupliquer dans la table l'enregistrement qui a été modifié avec les mêmes données en incrémentant le champs1 comme dit précédemment.

    Par exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Table1
    ------
    id | champs0  | champs1     | champs2 etc...
    ---------------------------------------
    1  |    aaa   |     0       |  aaaaa
    si je modifie champs2, je voudrais avoir une ligne comme ci-dessous:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    id | champs0  | champs1       | champs2 etc...
    ---------------------------------------
    1  |    aaa   |    0          |  aaaaa
    2  |    aaa   |    1 (0+1)    |  baaaa
    Merci !

  6. #6
    Membre du Club
    Inscrit en
    Août 2009
    Messages
    273
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 273
    Points : 46
    Points
    46
    Par défaut
    Voici mon code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
     
    CREATE OR REPLACE TRIGGER trigger_name
        BEFORE UPDATE ON table_name
        FOR EACH ROW
    BEGIN
     
    INSERT INTO table_name(champs0,champs1,champs2)
    VALUES(:new.champs0,NVL(:old.champs1,0) +1,:new.champs2)
     
    END;
    J'ai l'erreur suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    [1]: (Error): ORA-04091: table SYSADM.table_name is mutating, trigger/function may not see it ORA-06512: at "SYSADM.trigger_name", line 3 ORA-04088: error during execution of trigger 'SYSADM.trigger_name

  7. #7
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    Oubliez les triggers, fait un API PL/SQL qui fait ce que vous en avez besoin.
    Sinon, il y a des quelques solutions de type usine à gaz avec les triggers.

  8. #8
    Membre du Club
    Inscrit en
    Août 2009
    Messages
    273
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 273
    Points : 46
    Points
    46
    Par défaut
    Je voudrais bien faire un trigger pourquoi pas une solution de type usine à gaz.

  9. #9
    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
    Et si tu modifies 15 fois la première ligne ?

    Si ton but est d'avoir un historique, crées une table historique et insère dedans.

  10. #10
    Membre averti Avatar de macben
    Inscrit en
    Mars 2004
    Messages
    546
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Mars 2004
    Messages : 546
    Points : 433
    Points
    433
    Par défaut
    Surtout que si tu fais ça tu vas avoir l'erreur "ORA-XXX Table en mutation". (Enfin je crois )

  11. #11
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    Citation Envoyé par Jinkas Voir le message
    Je voudrais bien faire un trigger pourquoi pas une solution de type usine à gaz.
    Très bien !

    Regardez le tutoriel concernant la résolution de la table mutante sur ce site.

    Lisez cet article pour mieux comprendre pourquoi la solution de la table mutante n’est pas une vrai solution.

    Comme astuce: aux lieux d’insérer les enregistrements dans le trigger demandez à dbms_job de le faire via le trigger.

    Et rappelez-vous que la table mutante c’est un bug dans votre application.

  12. #12
    Membre du Club
    Inscrit en
    Août 2009
    Messages
    273
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 273
    Points : 46
    Points
    46
    Par défaut
    Merci à tous!

  13. #13
    Membre du Club
    Inscrit en
    Août 2009
    Messages
    273
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 273
    Points : 46
    Points
    46
    Par défaut
    Je ne sais pas si le fait de récupérer le max(id) dans une variable et d'incrémenter la variable à chaque insertion pour éviter Erreur ORA-00001: violation de contrainte est une bonne solution ?

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

Discussions similaires

  1. Requête update à partir d'une autre table
    Par amiral thrawn dans le forum Langage SQL
    Réponses: 5
    Dernier message: 15/02/2024, 11h40
  2. Pb d'update dans une DataGrid
    Par bidson dans le forum XMLRAD
    Réponses: 11
    Dernier message: 27/05/2003, 14h11
  3. [dBase]il y a mieux que la commande sql UPDATE ?
    Par sana72 dans le forum Autres SGBD
    Réponses: 4
    Dernier message: 12/12/2002, 11h59
  4. Réponses: 3
    Dernier message: 10/11/2002, 11h03
  5. update et virgule
    Par Delph dans le forum Bases de données
    Réponses: 8
    Dernier message: 27/08/2002, 14h40

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