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 :

Recuperer un identifiant dans le trigger


Sujet :

SQL Firebird

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé Avatar de freud
    Homme Profil pro
    Développeur
    Inscrit en
    Mai 2002
    Messages
    1 271
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 271
    Par défaut Recuperer un identifiant dans le trigger
    Bonsoir à tous,

    J'ai deux tables relier entre elles, maitre (TB_MAITRE) et secondaire (TB_LIGNE) dont les valeurs des clefs sont générer dans un trigger Before Insert. Ainsi,

    Table maitre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    CREATE OR ALTER TRIGGER TR_MAITRE FOR TB_MAITRE
    ACTIVE BEFORE INSERT OR UPDATE POSITION 0
    AS
    declare variable rowid integer;
    begin
     if (inserting) then
      begin
      SELECT RESULTAT FROM sp_compteur('TB_MAITRE') into :rowid;
      new.idMaitre= :rowid;
      end
    end
    Table secondaire:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    CREATE OR ALTER TRIGGER TR_LIGNE FOR TB_LIGNE
    ACTIVE BEFORE INSERT OR UPDATE POSITION 0
    AS
    declare variable rowid integer;
    begin
     if (inserting) then
      begin
      SELECT RESULTAT FROM sp_compteur('TB_LIGNE') into :rowid;
      new.idLigne= :rowid;
      end
    end
    Ma difficulté est de ne pas pouvoir recuperer au niveau de ce code l'identifiant de la table maitre lorsqu'un enregistrement est inserer et ce, afin que je puisse renseigner la foreign key de la table table secondaire.

    Pour l'instant, je recupere l'identifiant maitre par une fonction de retour à l'envoi des données dans le composant et de là je fais les insert des lignes avec cette valeur retournée.

    Serait-il possible de le faire dans le trigger ?

    Merci pour votre aide.

  2. #2
    Membre très actif Avatar de TryExceptEnd
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2006
    Messages
    501
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2006
    Messages : 501
    Par défaut
    Si l'insertion des deux tables ensemble ne se fait pas par une procedure stockée, il impossible de récupérer l'ID de la table maitre (TB_MAITRE) dans le trigger before insert de la table secondaire (TB_LIGNE) sauf a le renseigner manuellement.
    D'ailleurs la méthode que vous utilisez
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT RESULTAT FROM sp_compteur('TB_MAITRE') INTO :rowid;
    est vraiment casse-cou dans un envirennement client/serveur, utilisez plutôt un générateur.

  3. #3
    Membre Expert

    Homme Profil pro
    Consultant spécialité Firebird
    Inscrit en
    Mai 2002
    Messages
    2 342
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France

    Informations professionnelles :
    Activité : Consultant spécialité Firebird
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 342
    Par défaut
    le trigger n'est pas la bonne place pour cela
    par contre la clause returning de l'insert est faite pour ça

    http://www.firebirdsql.org/refdocs/l...sert-returning

  4. #4
    Membre éprouvé Avatar de freud
    Homme Profil pro
    Développeur
    Inscrit en
    Mai 2002
    Messages
    1 271
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 271
    Par défaut
    Bonjour et merci pour vos réponses.

    Citation Envoyé par TryExceptEnd
    est vraiment casse-cou dans un envirennement client/serveur, utilisez plutôt un générateur.
    En fait j'ai de nombreuse tables et pour la génération de clef j'ai utiliser la méthode à base de table des clefs parmi les deux méthodes décrite dans l'article Clefs auto incrémentées de SQL PRO et dans son article il ne dit pas qu'il faut l'eviter. Donc, j'ai cru qu'elle etait bonne....
    Alors je ne sais pas quelle sera l'ampleur des dégâts si je maintiens cette méthode puisque c'est un casse-cou comme vous dites. Probablement vous l'avez déjà eprouver.......

    Citation Envoyé par Makowski
    le trigger n'est pas la bonne place pour cela
    par contre la clause returning de l'insert est faite pour ça
    Pour la table secondaire ou pour la génération de clef en général ?

    La clause Returning je l'ai déjà utiliser mais dans un autre contexte. Je vais voir cela.

    Merci TryExceptEnd et Makowski

  5. #5
    Membre très actif Avatar de TryExceptEnd
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2006
    Messages
    501
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2006
    Messages : 501
    Par défaut
    Citation Envoyé par freud Voir le message
    En fait j'ai de nombreuse tables et pour la génération de clef j'ai utiliser la méthode à base de table des clefs parmi les deux méthodes décrite dans l'article Clefs auto incrémentées de SQL PRO et dans son article il ne dit pas qu'il faut l'eviter. Donc, j'ai cru qu'elle etait bonne....
    Alors je ne sais pas quelle sera l'ampleur des dégâts si je maintiens cette méthode puisque c'est un casse-cou comme vous dites. Probablement vous l'avez déjà eprouver.......
    Il a aussi écrit ceci dans l'article :
    S'il semble que les mécanismes spécifiques fournis par les éditeurs de SGBDR soient plus performants que la technique de la table des clefs, la mesure de cette performance est en revanche assez faible.
    Et je pense que ne pas utiliser les générateurs c'est se priver d'un outil fiable, rapide et pérenne.

  6. #6
    Membre Expert

    Homme Profil pro
    Consultant spécialité Firebird
    Inscrit en
    Mai 2002
    Messages
    2 342
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France

    Informations professionnelles :
    Activité : Consultant spécialité Firebird
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 342
    Par défaut
    Citation Envoyé par TryExceptEnd Voir le message
    I
    Et je pense que ne pas utiliser les générateurs c'est se priver d'un outil fiable, rapide et pérenne.
    Tout à fait
    et cet article date , je suis persuadé qu'il ne l'écrirait pas ainsi aujourd'hui

    gére ça dans des tables n'est vraiment pas efficace
    le seul cas ou cela peu se justifier c'est si l'on veut gérer des séries "sans trou"

    mais là pour des identifiants servant de PK, il faut utiliser les séquences (ou générateur), c'est fait pour

  7. #7
    Membre éprouvé Avatar de freud
    Homme Profil pro
    Développeur
    Inscrit en
    Mai 2002
    Messages
    1 271
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 271
    Par défaut
    Citation Envoyé par Makowski
    le seul cas ou cela peu se justifier c'est si l'on veut gérer des séries "sans trou"
    Et c'etait justement pour eviter les trous.

    Citation Envoyé par TryExceptEnd
    Et je pense que ne pas utiliser les générateurs c'est se priver d'un outil fiable, rapide et pérenne.
    Ouep ! , à refaire .......

    A quel endroit serait-il plus correct d'utiliser le générateur :
    dans un trigger before insert, dans un trigger after insert, dans un trigger de vue after insert ?

    Merci pour vos précieuses informations

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

Discussions similaires

  1. Recuperer derniere valeur modifiée dans un trigger
    Par xabs dans le forum Développement
    Réponses: 2
    Dernier message: 06/08/2004, 16h22
  2. comment recuperer une variable dans flash
    Par krépuscul dans le forum Flash
    Réponses: 30
    Dernier message: 16/10/2003, 09h40
  3. RAZ GENERATOR dans un trigger
    Par kase74 dans le forum SQL
    Réponses: 2
    Dernier message: 08/09/2003, 18h43
  4. select dans un trigger sous Postgresql
    Par kastor_grog dans le forum Requêtes
    Réponses: 1
    Dernier message: 03/09/2003, 17h00
  5. [PostgreSQL] Refus de STATEMENT dans un trigger
    Par alex2205 dans le forum Requêtes
    Réponses: 3
    Dernier message: 10/03/2003, 12h51

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