1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    octobre 2008
    Messages
    15
    Détails du profil
    Informations personnelles :
    Âge : 32
    Localisation : France, Indre et Loire (Centre)

    Informations forums :
    Inscription : octobre 2008
    Messages : 15
    Points : 11
    Points
    11

    Par défaut Trigger before insert - Connaitre les données insérées ?

    bonjour à tous,
    Je viens ici car j'ai un petit soucis avec informix .

    En effet je souhaiterais créer un trigger before insert, mais contrairement à Oracle j'ai l'impression qu'il n'est pas possible d'avoir les données insérées avant d'effectuer l'INSERT ?

    Plus en détails :

    Je souhaite effectuer certains contrôles avant un INSERT.
    En oracle c'est simple, je fais un trigger BEFORE INSERT, j'ai :new pour voir ce qui va être inséré.
    Mais en Informix j'ai l'impression qu'il n'est pas possible d'avoir cette donnée avant l'insert ? Un trigger "for each row" donne bien ces donnés une fois l'insert effectué, mais je ne peux pas exécuter ma procédure de contrôle car un des contrôles est justement de vérifier que les données n'existent pas déjà dans la table (non je ne peux pas passer simplement par un index, ça serait trop simple :/).
    Comme si le trigger before insert n'était pas prévu pour pouvoir agir sur l'insert ?

    J'ai bien essayé le "INSTEAD OF", mais apparemment non faisable sur un table, seulement sur une vue

    Existe-t-il une solution ou bien ça n'est pas possible ?

    Merci d'avance

    edit : j'ai finalement j'ai utilisé une autre solution, mais je laisse le sujet car si vous avez une réponse ça pourrait toujours être utile.

  2. #2
    Membre habitué
    Homme Profil pro
    Achitecte Informix SGBD et applications - IBM Champion - Data Management - Board of Directors IIUG
    Inscrit en
    octobre 2010
    Messages
    105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Achitecte Informix SGBD et applications - IBM Champion - Data Management - Board of Directors IIUG
    Secteur : Conseil

    Informations forums :
    Inscription : octobre 2010
    Messages : 105
    Points : 162
    Points
    162

    Par défaut

    Bonjour,

    je pense que tu as besoin des clauses "REFERENCING OLD as" et/ou "REFERENCING NEW as" dans la création de ton trigger, quelque chose comme cela non?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    create trigger mytrigger update of fname, lname on adr
    REFERENCING OLD AS o NEW AS n
    FOR EACH ROW
    (
        insert into mytable (old_value, new_value)
        values (o.fname, n.fname);
    )
    tu trouveras ton bonheur dans la doc à cet endroit

    Allez, Joyeux Noël!

    Eric

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    octobre 2008
    Messages
    15
    Détails du profil
    Informations personnelles :
    Âge : 32
    Localisation : France, Indre et Loire (Centre)

    Informations forums :
    Inscription : octobre 2008
    Messages : 15
    Points : 11
    Points
    11

    Par défaut

    Merci pour ton aide, et bonne année !

    Pour le REFERENCING old/new, il ne fonctionne qu'avec "FOR EACH ROW" qui est exécuté APRES l'insert.

    Mais finalement j'ai utilisé une autre solution de contournement, car je ne crois pas que cette solution était possible en IFX, on peut clore le sujet donc.

  4. #4
    Membre du Club
    Inscrit en
    juillet 2010
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : juillet 2010
    Messages : 35
    Points : 47
    Points
    47

    Par défaut

    Bonjour,

    Une façon de réaliser est de suivre l'exemple suivant tiré de la documentation ( "BEFORE and AFTER triggered actions" ):

    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
     
    CREATE PROCEDURE upd_items_p1()
       DEFINE GLOBAL old_qty INT DEFAULT 0;
       LET old_qty = (SELECT SUM(quantity) FROM items);
    END PROCEDURE;
     
    CREATE PROCEDURE upd_items_p2()
       DEFINE GLOBAL old_qty INT DEFAULT 0; 
       DEFINE new_qty INT;
       LET new_qty = (SELECT SUM(quantity) FROM items); 
       IF new_qty > old_qty * 1.50 THEN
          RAISE EXCEPTION -746, 0, 'Not allowed - rule violation';
       END IF
    END PROCEDURE;
     
    CREATE TRIGGER up_items
       UPDATE OF quantity ON items
          BEFORE(EXECUTE PROCEDURE upd_items_p1())
          AFTER(EXECUTE PROCEDURE upd_items_p2());
    Source: http://pic.dhe.ibm.com/infocenter/id...ds_sqt_530.htm


    Hope this help.

Discussions similaires

  1. Réponses: 4
    Dernier message: 11/08/2009, 12h03
  2. Trigger Before Insert
    Par Fred_ET dans le forum Administration
    Réponses: 7
    Dernier message: 22/11/2006, 00h29
  3. [SQL SERVER 2005] Connaitre les données modifiées.
    Par abrial dans le forum MS SQL-Server
    Réponses: 2
    Dernier message: 22/09/2006, 14h33
  4. Réponses: 2
    Dernier message: 16/05/2006, 10h52
  5. Créer un trigger "before insert" avec SQL Server
    Par bubi dans le forum Développement
    Réponses: 2
    Dernier message: 14/11/2005, 10h12

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