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

Langage SQL Discussion :

conception du MCD


Sujet :

Langage SQL

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 74
    Points : 38
    Points
    38
    Par défaut conception du MCD et TRIGGER
    Je sens que je vais être ciblé dans ce forum, si ce n'est déja fait , je me lance :

    je souhaite representé la gestion des pannes informatiques qui peut survenir dans une entreprise avec son service interne de la hotline.
    je vous montre mon mcd :


    (ps: ne faites pas attention aux deux clé primaires de la table panne, une simple erreur de ma part)

    Si vous trouvez quelque chose d'anormal qui colle pas faite le moi savoir.
    j'essaye de trouver une assez bonne base qui simule au mieux la tolerance aux pannes d'une entreprise.

    Ma question est la suivante :
    est ce qu'il est possible d'inserer une valeure dans un champs d'une table automatiquement cad que lorsque une panne est signalée sur un poste, le champ lib_etat de la table 'etat 'se met OUT.

    Merci de me donner vos avis =)

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    861
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 861
    Points : 965
    Points
    965
    Par défaut
    Citation Envoyé par aminlove88 Voir le message
    Ma question est la suivante :
    est ce qu'il est possible d'inserer une valeure dans un champs d'une table automatiquement cad que lorsque une panne est signalée sur un poste, le champ lib_etat de la table 'etat 'se met OUT.
    Avec un trigger?

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 74
    Points : 38
    Points
    38
    Par défaut
    Merci pour ton aide, je commencais à desesperé.
    Si le trigger me permettra une mise à jour automatique cad me renvoyer un etat OUT de l'ordianteur en cas de pann detectée sur celui ci, c'est ce qu'il me faut, mais elle devra à l'inverse me retourné un etat OK de l'ordianteur si celui ci a été réparé.
    Est possible de faire cela avec le TrIGGERS alors ?

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    861
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 861
    Points : 965
    Points
    965
    Par défaut
    Peux tu préciser sur quel environnement tu travailles?
    Quel est le sgdb, et comment il sera alimenté?

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 74
    Points : 38
    Points
    38
    Par défaut
    je suis dans un envt windows et je bosse avec SQL Server 2005 express sur Server et Client.
    Mais ça reste juste dans un contexte de simulation et susceptible d'être presentable pour l'examen en fin d'année
    il y a quelque chose que je dois savoir ?

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    861
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 861
    Points : 965
    Points
    965
    Par défaut
    Renseigne toi sur l'utilisation des trigger, ça doit être adapté à ton cas.
    Un trigger est associé à une table (ou autre), c'est un bloc pl sql qui s'executera lors d'un evenement sur cette table.
    Un exemple très rapide, quand on insère une valeur dans la table test1, on veut qu'elle soit également insérée dans une table test2 (sur Oracle) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    CREATE OR REPLACE TRIGGER TRG_TEST1
    BEFORE INSERT -- avant supression
    ON test1        -- sur la table EMP
    FOR EACH ROW  -- pour chaque ligne
    Begin  
      insert into test2 values (:NEW.champs1) ;
    End ;
    En faisant un trigger sur ta table panne, tu devrais pouvoir facilement mettre à jour l'état du poste référencé.

    Pour l'utilisation des trigger sous SQL Server : http://sqlpro.developpez.com/cours/s...ransactsql/#L5

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 74
    Points : 38
    Points
    38
    Par défaut
    je crois que pour avoir ce que je veux, un trigger ne me suffira pas :

    * un TRIGGER en cas d'insertion dans la table panne d'un poste, modifier son etat dans la table poste et le rendre OUT (de par son id_etat=2).

    * Et un autre dans le cas d'une panne qui est réparée, et dont l'identifiant(id_panne)de celle -ci se retrouve dans la table gérer par une insertion, modifier la table poste et rendre le poste concerné OK(id_poste=1)

    jviens dfaire un tour du coté du tuto, j'ai compri le fonct du trigger mais chui assez long à la detente et je n'ai pas eu l'impression que mon scenario a été illustré d'exemples (du moins par l'utilisation de differentes tables, 3 exactement sans compter la table temporaire)sans critiqué biensûr le document qui est bien expliqué
    je te montre ce que j'ai pigé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    create TRIGGER ins_panne
    on panne //j'ai mis la table dans laquelle on prend compte des valeures avant l'execution du trigger ? a moins que ce doit être la table qui subira une modification dont il faut ici rensigné..
    for update//trigger dans le but de modifier au final ma table poste
    as
    if (column_insert() & 6) > 0 //si dans l'une des colonnes de la table panne il y une insertion, commencer :
    update poste set id_etat =2
    from inserted 
    where inserted.id_poste=poste.id_poste
    merci de m'eclairer

  8. #8
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    861
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 861
    Points : 965
    Points
    965
    Par défaut
    C'est l'idée, ceci dit je crois que le 'from inserted' est de trop dans ton exemple.
    Ensuite, avec un trigger sur ta table 'gerer', tu récupères la panne concernée, et mets à jour le poste référencé en conséquence.
    Réfléchis bien à tous les scénarios possibles pour gérer les différents cas dans tes triggers.

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 74
    Points : 38
    Points
    38
    Par défaut
    je l'ai un peu modifié

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    create trigger trigger_etat
    on panne
    for insert
    as
    if(columns_updated() &6) > 0
    begin
    update poste set id_etat=2
    from poste p
    inner join inserted i
    on p.id_poste=i.d_poste
    end
    ça ne change toujours pas le champ id_etat de mes postes en panne.

    j'au aussi essayé plusieurs choses dont celle-ci, rien y fait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    create trigger trigger_etat
    on panne
    for insert 
    as
    IF (SELECT COUNT(id_panne) from panne) >= 1
    BEGIN 
    UPDATE poste SET id_etat = 2
    FROM poste
    WHERE id_poste IN
    ( SELECT id_poste FROM panne )
    END

  10. #10
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    861
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 861
    Points : 965
    Points
    965
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    UPDATE poste SET id_etat=2
    FROM poste p
    INNER JOIN inserted i
    ON p.id_poste=i.d_poste
    Ca m'étonnerai qu'il compile.
    Essaie plutot :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    UPDATE poste SET id_etat=2
    WHERE poste.id_poste=inserted.id_poste

  11. #11
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 74
    Points : 38
    Points
    38
    Par défaut
    ça ne marche toujours pas
    il me renvoi une erreur pour la commande que tu viens de me donner :

    "identificateur en plusieurs parties 'inserted.id_poste' ne peyut être lié "

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    create trigger trigger_etat
    on panne
    for insert
    as
    if(columns_updated() &6) > 0
    begin
    update poste set id_etat=2
    where poste.id_poste=inserted.id_poste
    end

  12. #12
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 74
    Points : 38
    Points
    38
    Par défaut
    et Bah prise de tête.....
    Fallait bien que je rensigne la table inserted ou se fait la modif:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    CREATE TRIGGER trigger_etat
    ON panne
    FOR INSERT
    AS
    IF(columns_updated() &6) > 0
    begin
    UPDATE poste SET id_etat=2
    from inserted
    WHERE poste.id_poste=inserted.id_poste
    end
    jte remerci de ton aide SNIPAH
    Me reste plus qu'a faire le reste, jreviens vous prendre la tête tres prochainement

  13. #13
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    861
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 861
    Points : 965
    Points
    965
    Par défaut
    Bon courage

  14. #14
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 74
    Points : 38
    Points
    38
    Par défaut
    deja de retour (ouai vous pouvez yaller ..chui nazee ^^)
    Ca se complique un peu a vrai dire.
    je dois maintenant donc faire l'inverse et retourner un etat OK si la panne signalée se retrouve résolue(de par id_panne si il est dans la table gerer).

    mais la table gerer dont le trigger se declenchera en cas d'insertion (dsl si je me repete) comme vous pouvez le voir dans le mcd du dessus (), n'est pas lié directement avec le champ de la table que je souhaite modifié(id_etat).
    contrairement au premier trigger que j'ai fait precedemment les deux tables concernées sont liées.

    Faut-il obligatoirement que je crée uine vue pour permettre cela ? ou peut-on créer des relations entre les diferentes table eloignées à l'interieur du TRIGGER.

    J'espere que j'ai été claire dans mes propos...

    voici la création dmon 2eme trigger erroné:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    create trigger trigger_etat2
    on gerer
    for insert 
    as
    if(columns_updated() &2) >2
    begin
    update poste set id_etat=1
    from inserted
    where poste.id_poste=inserted.id_poste
    end
    Merci.

  15. #15
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    861
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 861
    Points : 965
    Points
    965
    Par défaut
    La ligne insérée dans ta table 'gerer' ne référence pas directement un poste, mais une panne, qui elle même référence un poste.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    UPDATE poste SET id_etat=1
    FROM inserted
    WHERE poste.id_poste in (select id_poste from panne where id_panne = inserted.id_panne)

  16. #16
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 74
    Points : 38
    Points
    38
    Par défaut
    slt Spinah,

    Comens fais tu pour associer la table temporaire "inserted" au champ id_panne(panne) , sachant que les clés etrangeres sont id_poste(panne) et id_panne(gerer)
    la commande n'a pas l'air de marcher , je n'ai aucun changement de valeur aprés quelconque insertions mais je suis d'accord avec ton raisonnement.

  17. #17
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 74
    Points : 38
    Points
    38
    Par défaut
    Je continue à chercher autre chose sans relache
    j'accepte toutes aides venant egalement d'autres visiteurs n'hesitez pas...

  18. #18
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 74
    Points : 38
    Points
    38
    Par défaut
    Ok, hm..
    Y a t'il alors un moyen de supprimer une ligne de valeur d'une table si il y a insertion dans une autre table
    Dans ce cas 3 trigger seront necessaires

    *si la panne est résolue, alors elle est supprimée de la table panne
    *si la panne est inexistante sur le poste, lui mettre un etat 'OK'
    C'est se compliquer la vie, nn?
    Ca sent le monologue =).

  19. #19
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 849
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 849
    Points : 52 978
    Points
    52 978
    Billets dans le blog
    6
    Par défaut
    1) vous n'êtes pas sur le bon forum. Il existe un forum sur la modélisation
    2) vous n'agissez pas au niveau du MCD et viser tout de suite le MPD, ce n'est pas une méthode.

    A +

  20. #20
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 74
    Points : 38
    Points
    38
    Par défaut
    La structure et les relations de ma base sont déja faite, et je sais déja ce que les données veulent vraiment signifier pour ce qui est de la modelisation.
    Mon soucis majeur reste la syntaxe de ma requête SQL, à savoir le trigger et non la modelisation.
    J'ai proposé d'autre alternatives dans mon scenario pour etre compris, et aussi afin de trouver la solution car je n'ai pas trouvé de reponse.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [MCD] Conception Modélisation MCD Cardinalité
    Par alicc dans le forum Schéma
    Réponses: 3
    Dernier message: 05/10/2011, 16h29
  2. conception uml mcd
    Par benhsaien dans le forum ALM
    Réponses: 0
    Dernier message: 29/03/2011, 11h41
  3. conception modele MCD
    Par minooo dans le forum Modélisation
    Réponses: 1
    Dernier message: 20/11/2010, 15h40
  4. Aide pour conception de MCD
    Par maxdial dans le forum Merise
    Réponses: 1
    Dernier message: 01/11/2010, 21h50
  5. [CONCEPTION MCD] Problème avec les clés composées
    Par fabriceMerc dans le forum Schéma
    Réponses: 3
    Dernier message: 14/02/2005, 09h43

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