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

PL/SQL Oracle Discussion :

Trigger contrainte d'exclusion


Sujet :

PL/SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Invité
    Invité(e)
    Par défaut Trigger contrainte d'exclusion
    Bonjour,

    Je suis actuellement confronté à une difficulté sur l'un de mes trigger.

    voici la situation:
    J'ai trois tables, une table PARTICIPANT (ce qui nous interesse dans cette table c'est l'id du participant), une table CONTENUHEBERGEMENT et une table BENEVOLE. Ces deux dernières tables on comme clef étrangère l'id du participant (nommée respectivement idparticipant et idbenevole).

    la contrainte est la suivante: si j'ai l'id dans de mes participants dans la table CONTENUHEBERGEMENT cette même id ne doit pas être dans la table BENEVOLE et vice-versa.

    J'ai donc écrit un trigger, mais je n'arrive pas à quelque chose qui compile.

    Pour le moment je ne trouve pas de solution satifaisante, je vous remercie d'avance.


    Voici mon code:
    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
     
       create or replace trigger contraintebenevole
       before insert or update
       on benevole
       declare
       dejaheberge exception;
       begin
       if :new.IDBENEVOLE in
       (select IDPARTICIPANT from CONTENUHEBERGEMENT where :new.IDBENEVOLE = CONTENUHEBERGEMENT.IDPARTICIPANT)
       then
       raise dejaheberge;
       end if;
       exception
       when others then                                                              
        raise_application_error (-20111, 'Un bénévole ne peux pas etre heberger.');
       end;
    Dernière modification par Invité ; 20/05/2018 à 20h02.

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Avec un peu d'aide j'ai reussi je vous montre donc la réponce et je passe en résolu:

    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
    create or replace trigger contraintebenevole
    before insert or update
    on benevole
    FOR EACH ROW
    declare
    idp number;
    dejaheberge exception;
    begin
      select count(*) into idp
      from contenuhebergement
      where contenuhebergement.idparticipant = :new.idbenevole;
      if idp >= 1 then
      raise dejaheberge;
      end if;
     
      exception
      when dejaheberge then
      raise_application_error (-20111, 'Un bénévole ne peux pas être hebergé.');
      when no_data_found then
      null;
    end;

  3. #3
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Vous avez un problème de modélisation.
    Votre solution avec des déclencheurs permet de contourner le problème, mais croyez-moi ce n'est pas la panacée.

    Rajoutez une table TYPE_PARTICIPANT de ce type :
    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
    create table participant_type
    ( id_participant    number      not null
    , type_participant  varchar2(1) not null
    , constraint pk_participant_type
        primary key (id_participant)
    , constraint fk_particip_type_particip
        foreign key (id_participant)
        references participant (id_participant)
    , constraint uk_participant_type
        unique (id_participant, type_participant)
    );
     
    insert into participant_type (id_participant, type_participant)
    select distinct id_participant, 'C'
      from contenuhebergement;
     
    insert into participant_type (id_participant, type_participant)
    select distinct id_participant, 'B'
      from benevole;
     
    commit;
    Et maintenant faites portez les clefs étrangères de CONTENUHEBERGEMENT et BENEVOLE sur le couple (id_participant, type_participant).
    Il vous faudra rajouter une constante dans vos tables, mais au moins plus besoin de déclencheur.

  4. #4
    Invité
    Invité(e)
    Par défaut
    Merci, malheureusement, la modélisation m'est imposée. J'ai donc composé comme je pouvais.

    Mais je note le jour ou j'en aurais à nouveau besoin.

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

Discussions similaires

  1. Contraintes d'exclusion / totalité / inclusion
    Par Sandriiine dans le forum PowerAMC
    Réponses: 2
    Dernier message: 24/07/2009, 13h10
  2. [MCD] Contrainte d'exclusion
    Par touronster dans le forum Schéma
    Réponses: 6
    Dernier message: 10/11/2008, 17h27
  3. [MySQL] requête avec une contrainte d'exclusion portant sur une liste de valeurs
    Par vincounet dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 25/08/2008, 14h54
  4. [DC] Contrainte d'exclusion
    Par zghidi dans le forum Diagrammes de Classes
    Réponses: 3
    Dernier message: 12/01/2008, 18h40
  5. Contrainte d'exclusion avec mySQL et moteur innoDB
    Par Alain Defrance dans le forum SQL Procédural
    Réponses: 8
    Dernier message: 02/01/2008, 16h18

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