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 :

Problème de triggers (2)


Sujet :

Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    899
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 899
    Par défaut Problème de triggers (2)
    bonjour à tous et à toutes,
    Voilà j'ai 2 tables sous Oracle : Personne et Presente, je voudrais automatiser un champ appelé NB_PRE qui compte le nombre de présentateurs pour une émission : voiçi la structure des deux tables :
    Personne(CodPers,Nom,Prénom,Spécialité,NCh,Nb_Emis);
    Présente(CodEmis,CodPers,Nb_Pre);
    J'ai écrit ce trigger sur l'évènement Avant Insertion qui fonctionne mais qui me laisse toujours la dernière ligne saisie non renseignée vu qu'elle n'est pas encore connue dans la table comment faire ?
    Voiçi le code du trigger :
    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    CREATE OR REPLACE TRIGGER  "Enr_Presente_NB_PRE_3" 
    before insert on Presente
    for each row
    declare
    wnb_pre number(2);
    wnb_pre1 number(2);
    wcodemis number(2);
    wcount number(2);
    begin
    içi je compte le nombre de lignes correspondant à la nouvelle saisie
    select count(*) into wnb_pre from Presente where Presente.codemis=:new.codemis;
    
    içi si la table n'est pas vide je compte le nombre de lignes quand le champ nb_pre n'est pas renseigné 
    select count(*) into wcount from presente;
    if wcount <> 0 then
      select presente.codemis into wcodemis from presente where presente.nb_pre is null;
    end if;
    select count(*) into wnb_pre1 from presente where presente.codemis=wcodemis;
    
    update presente set nb_pre=wnb_pre1 where presente.codemis=wcodemis;
    update Presente set nb_pre=wnb_pre + 1 where presente.codemis=:new.codemis;
    
     
        
    end;
    /
    ALTER TRIGGER  "Enr_Presente_NB_PRE_3" ENABLE
    /
    Le problème est donc que la ligne non renseignée est la ligne que je suis en train de saisir, j'ai essayé d'écrire un trigger sur l'évènement après insertion mais ça ne marche pas .
    Si quelqu'un a une idée.
    MErçi

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Février 2010
    Messages
    412
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 412
    Par défaut
    Il serait plus sain de ne pas faire cela, c'est a dire de ne pas stocker d'informations calculables, et de garder un schema normalise (la on passe pas le 1-FN).
    http://fr.wikipedia.org/wiki/Forme_n...ormes_normales
    Sur le long terme on y gagne
    Sinon, ca va vous causer un nombre de mises a jour inutiles, et si jamais vous avez un soucis dans le trigger ou n'importe quoi, le nombre risque d'etre faux. Ces erait dommage.

    Apres, si vous avez besoin de cette information souvent, pourquoi ne pas faire une vue? Ou une colonne virtuelle?

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    899
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 899
    Par défaut
    Citation Envoyé par Rams7s Voir le message
    Il serait plus sain de ne pas faire cela, c'est a dire de ne pas stocker d'informations calculables, et de garder un schema normalise (la on passe pas le 1-FN).
    http://fr.wikipedia.org/wiki/Forme_n...ormes_normales
    Sur le long terme on y gagne
    Sinon, ca va vous causer un nombre de mises a jour inutiles, et si jamais vous avez un soucis dans le trigger ou n'importe quoi, le nombre risque d'etre faux. Ces erait dommage.

    Apres, si vous avez besoin de cette information souvent, pourquoi ne pas faire une vue? Ou une colonne virtuelle?
    MErçi pour votre réponse,
    1) j'ai revu les notions de 1-FN et je me pose la question en quoi ma table presente n'est pas en 1-FN ? Une relation est en première forme normale si tous les attributs non clé sont en dépendance fonctionnelle avec la clé. Dépendance fonctionnelle : la clé CodEmis détermine les champs non clés de la table.C'est à dire que CodEmis ne déterminerait pas NB_Pre car c'est un champ calculé ? C'est surement ça que vous vouliez me dire ... merçi de confirmer.
    2)j'ai suivi votre conseil j'ai créé une vue et j'ai bien le résultat que je voulais .
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    create or replace view Nb_Presente as
    select codemis, count(*)as NB_PRE from Presente  group  by codemis;

  4. #4
    Membre chevronné
    Profil pro
    Inscrit en
    Février 2010
    Messages
    412
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 412
    Par défaut
    Il est calcule, exactement.

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    899
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 899
    Par défaut
    Citation Envoyé par Rams7s Voir le message
    Il est calcule, exactement.
    Merçi de votre confirmation, savez vous comment écrire un trigger qui enchaine un autre ? Je n'arrive pas trouver ça .
    Merçi

  6. #6
    Membre Expert
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Février 2012
    Messages
    652
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Distribution

    Informations forums :
    Inscription : Février 2012
    Messages : 652
    Par défaut
    Houlà !
    Déjà que les triggers ne sont pas conseillés, tu veux maintenant les mettre en cascades

  7. #7
    Membre éprouvé
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2011
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Décembre 2011
    Messages : 52
    Par défaut
    Bonjour,

    à mon avis il serait plus conforme, et plus simple, d'utiliser une séquence à la place d'un trigger dans ce cas, tel que tu nous le présentes.

  8. #8
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 953
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 953
    Par défaut
    Euh non pas une séquence, la proposition de Rams de faire une vue est très bien.

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

Discussions similaires

  1. PL/SQL problème sur Trigger
    Par kitsune dans le forum PL/SQL
    Réponses: 4
    Dernier message: 06/12/2005, 20h35
  2. [9i] problème avec trigger after logon
    Par Michael# dans le forum Oracle
    Réponses: 2
    Dernier message: 17/03/2005, 12h14
  3. [Interbase6] Problème de triggers
    Par emeraudes dans le forum Bases de données
    Réponses: 4
    Dernier message: 08/03/2005, 09h52
  4. [SQLPLUS] - Problème de Triggers Java
    Par farcis dans le forum Oracle
    Réponses: 7
    Dernier message: 23/12/2004, 09h21
  5. [PL/SQL] problème de trigger
    Par Chuck67 dans le forum Oracle
    Réponses: 14
    Dernier message: 09/12/2004, 23h17

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