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 Firebird Discussion :

[Err BDE 10059] TRIGGER ON_UPDATE


Sujet :

SQL Firebird

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 74
    Points : 62
    Points
    62
    Par défaut [Err BDE 10059] TRIGGER ON_UPDATE
    bonjour,

    j'ai une table, MA_TABLE, avec un champ calculé, Z. C'est la somme de 2 champs de la même table, X et Y.

    Mon trigger ressemble à ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    CREATE TRIGGER ON_MODIF_X 
    FOR MA_TABLE AFTER INSERT POSITION 0 AS BEGIN   
    UPDATE MA_TABLE SET MA_TABLE.Z = MA_TABLE.X + MA_TABLE.Y; END
    et je me suis dit que ça devait plutôt être
    AFTER UPDATE
    et là drôle d'erreur lors de la modification d'un enregistrement :
    Exception du BDE 10059 : Trop de requêtes en cours d'exécution...

    alors je suis revenu à mon premier trigger, me suis assuré que ça marchait en modification. C'est bien le cas. :-)

    Mais tout de même, je me demande ce que le second trigger faisait de si extraordinaire. Et comment se fait-il que l'évènement AFTER_INSERT soit déclenché sur des requêtes UPDATE ?
    (AFTER_) INSERT correspond ici à l'insertion de valeurs de champs de la table et non pas d'un enregisrement complet ?

    merci d'avance pour vos lanternes
    seb

  2. #2
    Membre expert
    Avatar de Barbibulle
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    2 048
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 2 048
    Points : 3 342
    Points
    3 342
    Par défaut
    oula oula..
    Tu es en train de mattre à jour ta table dans le trigger avec un ordre SQL update ce qui à pour effet de redéclencher ce même trigger... et tu entre dans une boucle sans fin...

    Apres cette remarque deux solutions :
    1-Une colonne décrite comme étant computed
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    CREATE TABLE MA_TABLE (
        NUM   INTEGER,
        X     SMALLINT,
        Y     SMALLINT,
        Z     COMPUTED BY (X+Y)
    );
    2-Deux triggers (un before Update et un before Insert)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    CREATE TRIGGER MA_TABLE_BI0 FOR MA_TABLE
    ACTIVE BEFORE INSERT POSITION 0
    AS
    begin
      NEW.Z=NEW.X+NEW.Y;
    end
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    CREATE TRIGGER MA_TABLE_BU0 FOR MA_TABLE
    ACTIVE BEFORE UPDATE POSITION 0
    AS
    begin
      NEW.Z=NEW.X+NEW.Y;
    end

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 74
    Points : 62
    Points
    62
    Par défaut
    merci. je comprends mieux.
    Encore un point un peu obscur...
    Comment se fait-il que mon trigger actuel (le AFTER_INSERT)
    fasse bien ce que je veux lorsque je mets à jour les valeurs de X ou Y ?
    seb

  4. #4
    Membre expert
    Avatar de Barbibulle
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    2 048
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 2 048
    Points : 3 342
    Points
    3 342
    Par défaut
    Lorsque tu fais un "insert" dans la table, celà va déclencher tous les triggers de type insert. Donc le Before insert et le after insert.

    Que fais tu dans ce after insert :
    tu lances l'ordre SQL
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    UPDATE MA_TABLE SET MA_TABLE.Z = MA_TABLE.X + MA_TABLE.Y;
    Que fait cet ordre ? Il met à jour toutes les valeurs de ta table (donc tous les enregistrements). Pour chaque enregistrement (et donc celui qui vient d'être inséré également) de la table il va calculer le Z et mettre à jour cette colonne... Ce qui est lourd... Et en plus si tu as des triggers de type "update" ils seront déclenchés...

    Autre remarque : Je vois que l'erreur que tu as eut est une erreur véhiculé par BDE. Sache que BDE est abandonné et ne sera plus dans les prochaines version de Delphi et BC++. Donc il est fortement recommandé d'utiliser autre chose...

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 74
    Points : 62
    Points
    62
    Par défaut
    Pour le BDE qu'il vaut mieux ne plus utiliser dans les nouveaux projets, je suis au courant, mais merci quad même ;-).
    En fait, ce dev s'inscrit dans la maintenance d'un programme...

    Merci pour l'explication de ce que fait l'ordre de la requête de trigger.
    Il faudra que je vérifie quelques triggers...

    Mais pour revenir à ma question, je fais un "update" sur ma table,
    et l'évènement AFTER_INSERT se décleche, ça m'arrange :-) ... mais c'est pas un peu zarb ?
    seb

  6. #6
    Membre expert
    Avatar de Barbibulle
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    2 048
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 2 048
    Points : 3 342
    Points
    3 342
    Par défaut
    Citation Envoyé par Seb des Monts
    Mais pour revenir à ma question, je fais un "update" sur ma table,
    et l'évènement AFTER_INSERT se décleche, ça m'arrange :-) ... mais c'est pas un peu zarb ?

    Le after insert ne se declenche qu'apres l'insertion dans la table. Donc c'est que tu fais un insert quelque part !

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 74
    Points : 62
    Points
    62
    Par défaut
    dac.
    merci beaucoup.
    seb

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

Discussions similaires

  1. [BDE][ORACLE] Créer un trigger depuis un TQuery
    Par Zatoobux dans le forum Bases de données
    Réponses: 3
    Dernier message: 13/09/2007, 16h21
  2. L'avenir du BDE et des SQL Links révélé ! <officiel>
    Par Merlin dans le forum Bases de données
    Réponses: 12
    Dernier message: 02/06/2006, 10h18
  3. Err $251E avec le BDE... pour un prog sur une becane...
    Par Harry dans le forum Bases de données
    Réponses: 14
    Dernier message: 11/04/2006, 17h59
  4. Pb BDE suite a passage en Windows 2000 pro
    Par ARIF dans le forum Paradox
    Réponses: 4
    Dernier message: 18/11/2002, 11h39
  5. comment creer un alias dynamique avec BDE et ODBC
    Par david33 dans le forum C++Builder
    Réponses: 2
    Dernier message: 12/07/2002, 11h50

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