Bonjour :oops:
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
Version imprimable
Bonjour :oops:
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
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 ?
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é
Bonjour
Non ça ne marchera pas. La contrainte telle que présentée par Devalender
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-).Code:
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;
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
Bonjour,
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 :roll:) 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 :D contrairement à nos jours
Bonjour Sergio
C'est bien ce que j'ai compris aussi, même si j'en vois pas l’intérêt ... :koi:
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 :
Bien sur, la partie "NOT EXISTS" sera enclenchée à chaque suppression ...Code:
1
2
3
4 IF NOT EXISTS(select 1 from Consulation where patient.id = xxx) begin -- on efface le patient end
Olivier
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
Re,
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 suffireCitation:
Envoyé par dzconception