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 :

probleme trigger firebird ?


Sujet :

SQL Firebird

  1. #1
    Candidat au Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Février 2015
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Algérie

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Santé

    Informations forums :
    Inscription : Février 2015
    Messages : 4
    Points : 4
    Points
    4
    Par défaut probleme trigger firebird ?
    Bonjour

    un trigger qui fait un test avant delete avec deux tables patients et consultions

    Si un patient a des consultations (champs code_pat) ce dernier ne doit pas être supprimé.

    merci et bonne journée

  2. #2
    Membre expérimenté
    Homme Profil pro
    Ingenieur de recherche - Ecologue
    Inscrit en
    Juin 2003
    Messages
    1 146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingenieur de recherche - Ecologue

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 146
    Points : 1 412
    Points
    1 412
    Par défaut
    Le trigger porte sur quelle table ?
    Consutation, j'imagine ?

    Pourquoi pas le faire après delete ? Une requete de suppression de Patients quand le nombre de consultation est égale à zéro ?
    Merci d'ajouter un sur les tags qui vous ont aidé

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    245
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 245
    Points : 534
    Points
    534
    Par défaut
    Bonjour,

    Ça ressemble beaucoup à la définition d'une contrainte d'intégrité.
    Comme je suppose que dans la table CONSULTATIONS il y a un champ PATIENT lié par une clé étrangère à la clé primaire de PATIENTS, il suffit de préciser dans la définition de cette contrainte ON DELETE NO ACTION pour que la suppression de l'enregistrement correspondant dans la table PATIENTS avorte s'il est utilisé par la table CONSULTATIONS.
    Voir http://www.ibphoenix.com/files/60All.zip

    André

  4. #4
    Membre éprouvé
    Homme Profil pro
    Benevole
    Inscrit en
    Mai 2004
    Messages
    1 675
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Benevole
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 675
    Points : 952
    Points
    952
    Par défaut
    Citation Envoyé par alanglet Voir le message
    Bonjour,
    Ça ressemble beaucoup à la définition d'une contrainte d'intégrité.
    Comme je suppose que dans la table CONSULTATIONS il y a un champ PATIENT lié par une clé étrangère à la clé primaire de PATIENTS, il suffit de préciser dans la définition de cette contrainte ON DELETE NO ACTION pour que la suppression de l'enregistrement correspondant dans la table PATIENTS avorte s'il est utilisé par la table CONSULTATIONS.
    Exactement ! un truc du genre (code à adapter !) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    ALTER TABLE Table_CONSULTATIONS 
    ADD CONSTRAINT  nom_contrainte FOREIGN KEY (Clé_étrangère_Table_CONSULTATIONS) 
    REFERENCES  Table_PATIENT(Clé_primaire_Table_PATIENT) 
    ON DELETE NO ACTION;

  5. #5
    Membre expérimenté
    Homme Profil pro
    Ingenieur de recherche - Ecologue
    Inscrit en
    Juin 2003
    Messages
    1 146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingenieur de recherche - Ecologue

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 146
    Points : 1 412
    Points
    1 412
    Par défaut
    Bonjour

    Non ça ne marchera pas. La contrainte telle que présentée par Devalender
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ALTER TABLE Table_CONSULTATIONS 
    ADD CONSTRAINT  nom_contrainte FOREIGN KEY (Clé_étrangère_Table_CONSULTATIONS) 
    REFERENCES  Table_PATIENT(Clé_primaire_Table_PATIENT) 
    ON DELETE NO ACTION;
    empêchera d'effacer des lignes des Patient si des consultations existent, mais en laissant les Consultations. Hors il me semble que c'est l'inverse qui est demandé (effacer le patient qui n'aurait plus/pas de consultation - ce en quoi je ne voit pas l'utilité, on ne sait jamais il pourrait quand même revenir un jour ! mais c'est un autre histoire-).

    La contrainte devrait de tout façon exister. (pas de consultation sans patient !).

    Je pense que passer par un trigger est justifié, mais par un After et non un Before. En utilisant via un Before, ca va poser des problèmes d'intégrité (si les contraintes on bien été définies).
    a+
    olivier
    Merci d'ajouter un sur les tags qui vous ont aidé

  6. #6
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 029
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 029
    Points : 40 928
    Points
    40 928
    Billets dans le blog
    62
    Par défaut
    Bonjour,
    Citation Envoyé par dzconception Voir le message
    Si un patient a des consultations (champs code_pat) ce dernier ne doit pas être supprimé.
    la contrainte proposée suffit, par contre le ON DELETE NO ACTION (par défaut) est à débattre, car si on veut réellement supprimer un patient autant supprimer aussi les consultations pour ce dernier

    je ne comprend pas le besoin de trigger sauf si le trigger s'applique à la table consultations et non à la table patients (étrange que cette démarche mais pourquoi pas ) donc s'il s'agit d'effacer le patient qui n'aurait plus de consultation. Dans ce cas là, la contrainte étant mise, c'est bien un Trigger AFTER DELETE sur la table CONSULTATIONS qu'il faudrait écrire et encore cela ne fonctionnera pas facilement.

    Exemple :
    j'ai 10 consultations pour un patient, je vais supprimer ces consultations, le trigger After DELETE se déclenchera 10 fois pour supprimer le patient (donc mauvais plan, sauf à gérer l'exception dans le trigger)

    Bref je pense que dzconception a mal poser son problème

    @alanglet merci pour ces archives d'interbase 6, ça date un peu mais c'est vrai qu'à l'époque les manuels étaient bien rédigés contrairement à nos jours
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  7. #7
    Membre expérimenté
    Homme Profil pro
    Ingenieur de recherche - Ecologue
    Inscrit en
    Juin 2003
    Messages
    1 146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingenieur de recherche - Ecologue

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 146
    Points : 1 412
    Points
    1 412
    Par défaut
    Bonjour Sergio



    Citation Envoyé par SergioMaster Voir le message
    je ne comprend pas le besoin de trigger sauf si le trigger s'applique à la table consultations et non à la table patients (étrange que cette démarche mais pourquoi pas ) donc s'il s'agit d'effacer le patient qui n'aurait plus de consultation. Dans ce cas là, la contrainte étant mise, c'est bien un Trigger AFTER DELETE sur la table CONSULTATIONS qu'il faudrait écrire et encore cela ne fonctionnera pas facilement.
    C'est bien ce que j'ai compris aussi, même si j'en vois pas l’intérêt ...


    Citation Envoyé par SergioMaster Voir le message
    Exemple :
    j'ai 10 consultations pour un patient, je vais supprimer ces consultations, le trigger After DELETE se déclenchera 10 fois pour supprimer le patient (donc mauvais plan, sauf à gérer l'exception dans le trigger)
    Pourquoi gérer les exceptions ? La suppression du patient ne se produira que lorsque le nombre de consultations sera égale à zéro, pas avant évidemment avec un truc comme cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    IF NOT EXISTS(select 1 from Consulation where patient.id = xxx)
    begin
       -- on efface le patient
    end
    Bien sur, la partie "NOT EXISTS" sera enclenchée à chaque suppression ...

    Olivier
    Merci d'ajouter un sur les tags qui vous ont aidé

  8. #8
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 029
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 029
    Points : 40 928
    Points
    40 928
    Billets dans le blog
    62
    Par défaut
    Bonjour,
    Citation Envoyé par dehorter olivier Voir le message
    Pourquoi gérer les exceptions ? La suppression du patient ne se produira que lorsque le nombre de consultations sera égale à zéro, pas avant évidemment avec un truc comme cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    IF NOT EXISTS(select 1 from Consulation where patient.id = xxx)
    begin
       -- on efface le patient
    end
    Bien sur, la partie "NOT EXISTS" sera enclenchée à chaque suppression ...
    je pensais plutôt à un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    DELETE FROM PATIENT WHERE PATIENT=OLD.ID_PATIENT;
    WHEN ANY DO BEGIN END;
    moins gourmand en temps
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  9. #9
    Membre expérimenté
    Homme Profil pro
    Ingenieur de recherche - Ecologue
    Inscrit en
    Juin 2003
    Messages
    1 146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingenieur de recherche - Ecologue

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 146
    Points : 1 412
    Points
    1 412
    Par défaut
    Bonjour
    Citation Envoyé par SergioMaster Voir le message
    Bonjour,


    je pensais plutôt à un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    DELETE FROM PATIENT WHERE PATIENT=OLD.ID_PATIENT;
    WHEN ANY DO BEGIN END;
    moins gourmand en temps
    En effet

    Curieux que le créateur du post ne se manifeste pas .....
    Merci d'ajouter un sur les tags qui vous ont aidé

  10. #10
    Candidat au Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Février 2015
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Algérie

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Santé

    Informations forums :
    Inscription : Février 2015
    Messages : 4
    Points : 4
    Points
    4
    Par défaut
    bjr

    j'ai une autre solutions est de faire un select avec count sur la table consultations avec code patient si elle <>0 je doit pas supprimer


    votre suggestion ?

    bonne journée

  11. #11
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 029
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 029
    Points : 40 928
    Points
    40 928
    Billets dans le blog
    62
    Par défaut
    Re,

    Citation Envoyé par dzconception
    un select avec count sur la table consultations avec code patient si elle <>0
    encore plus couteux en temps d'exécution que le IF NOT EXISTSnon, tout d'abord, il nous faudrait les vrais raisons de ces suppressions car, après tout, seule la contrainte de clé étrangère pourrait suffire
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

Discussions similaires

  1. Problème trigger BEFORE UPDATE
    Par berceker united dans le forum SQL Procédural
    Réponses: 8
    Dernier message: 30/08/2006, 16h55
  2. probleme trigger
    Par sanyugioh dans le forum Oracle
    Réponses: 3
    Dernier message: 13/04/2006, 15h46
  3. Probleme trigger mysql 5
    Par DarkMax dans le forum SQL Procédural
    Réponses: 7
    Dernier message: 18/03/2006, 22h50
  4. Problem Trigger instead of
    Par bubi dans le forum Développement
    Réponses: 1
    Dernier message: 01/12/2005, 23h31
  5. probleme trigger
    Par samourai_alex dans le forum Oracle
    Réponses: 10
    Dernier message: 05/01/2005, 11h37

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