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

Oracle Discussion :

[TRIGGER] mise à jour d'un champ de la ligne updatée


Sujet :

Oracle

  1. #1
    in
    in est déconnecté
    Membre expérimenté Avatar de in
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    1 612
    Détails du profil
    Informations personnelles :
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 612
    Points : 1 718
    Points
    1 718
    Par défaut [TRIGGER] mise à jour d'un champ de la ligne updatée
    Bonjour,

    ça fait un baille que je n'ai ni fait de trigger ni de pl/SQL et j'ai un petit souci.

    En gros, j'ai une table Document avec :
    id VARCHAR2
    est_supprime SMALLINT
    date_suppression DATE

    Je veux un trigger qui se déclenche lors de la mise à jour du champ est_supprime (valeur passe de 0 à 1) et qui mette à jour le champ date_suppression correspondant avec la date courante.

    J'ai donc écrit ceci :
    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 MajSuppressionDoc
    BEFORE UPDATE OF est_supprime
    ON DOCUMENT 
     
    BEGIN
    	UPDATE DOCUMENT
    	SET new.date_suppression = TO_DATE(SYSDATE,'yyyy-mm-dd')
    	WHERE :OLD.est_supprime = 0 AND :NEW.est_supprime = 1;
     
    END; 
    /
    j'obtiens comme erreur :
    ORA-04082: NEW or OLD references not allowed in table level triggers

    Donc, je sens bien que mon code n'a pas l'air tip top mais voilà, je bloque.

    any idea ?
    "If email had been around before the telephone was invented, people would have said, 'Hey, forget email! With this new telephone invention I can actually talk to people!"

    Besoin d'une nouvelle méthode pour développer ? -> http://www.la-rache.com/

  2. #2
    Inactif   Avatar de Médiat
    Inscrit en
    Décembre 2003
    Messages
    1 946
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 946
    Points : 2 227
    Points
    2 227
    Par défaut
    ajoute "for each row" dans la déclaration de ton trigger.
    J'affirme péremptoirement que toute affirmation péremptoire est fausse
    5ième élément : barde-prince des figures de style, duc de la synecdoque
    Je ne réponds jamais aux questions techniques par MP

  3. #3
    Membre expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Points : 3 609
    Points
    3 609
    Par défaut
    Si tu fais un update tu vas avoir l'erreur ORA-04091 (table mutante), privilégie donc la solution suivante :
    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 MajSuppressionDoc 
    BEFORE UPDATE OF est_supprime 
    ON DOCUMENT 
    FOR EACH ROW
     
    BEGIN 
      if :OLD.est_supprime = 0 AND :NEW.est_supprime = 1 then
         :new.date_suppression = TO_DATE(SYSDATE,'yyyy-mm-dd');
      end if;  
    END; 
    /
    Un problème sans solution est un problème mal posé

    Merci de poser vos questions sur le forum, je ne réponds pas aux questions posées par MP.

  4. #4
    in
    in est déconnecté
    Membre expérimenté Avatar de in
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    1 612
    Détails du profil
    Informations personnelles :
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 612
    Points : 1 718
    Points
    1 718
    Par défaut
    Cool,

    écoute, 19/20 pour la réponse.

    Effectivement j'avais une table mutante avec la première solution.
    La seconde marche parfaitement.

    Je pensais seulement ne pas avoir à utiliser for each row ...

    sinon le point en moins c'est pour l'erreur de syntaxe := ....

    je plaisante.


    Merci beaucoup
    "If email had been around before the telephone was invented, people would have said, 'Hey, forget email! With this new telephone invention I can actually talk to people!"

    Besoin d'une nouvelle méthode pour développer ? -> http://www.la-rache.com/

  5. #5
    Membre expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Points : 3 609
    Points
    3 609
    Par défaut
    Citation Envoyé par in
    sinon le point en moins c'est pour l'erreur de syntaxe := ....
    [mode mauvaise fois on]
    C'était pour voir si tu suivais
    [mode mauvaise fois off]
    Un problème sans solution est un problème mal posé

    Merci de poser vos questions sur le forum, je ne réponds pas aux questions posées par MP.

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 13/05/2014, 12h46
  2. Réponses: 4
    Dernier message: 02/01/2014, 13h39
  3. Trigger de mise à jour automatique du champ inséré
    Par popovitch130 dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 06/08/2008, 09h05
  4. mise à jour automatique de champs entre 2 tables
    Par romdyane dans le forum Access
    Réponses: 5
    Dernier message: 11/10/2005, 18h51
  5. Réponses: 2
    Dernier message: 12/02/2003, 15h26

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