
Envoyé par
Just-Soft
merci pour la réponse quoique pour le 1ière partie je ne suis pas tout à fait d'accord car une clé étrangère résoudrait le problème de l'enregistrement correspondant.
En théorie oui, mais ca ne traiterai qu'un cas particulier...
S'il y a plusieurs clés étrangères, laquelle choisir ? S'il n'y en a pas, (gérer par l'application) comment faire ? Si c'est une relation n-n quoi mettre à jour ? etc... Beaucoup de cas qui ne peuvent pas être gérés 'automatiquement' avec une règle 'simple'.
De plus ca pose des problèmes plus profonds, comme : Si je supprime ma clé étrangère quid des contraintes liés ?

Envoyé par
Just-Soft
donc, je vais voir coté triggers même si ça parait difficile rien qu'en lisant le nom triggers .....
Il n'y a rien de compliqué dans les triggers.
Un trigger peut être exécuté avant ou après une action. (une action c'est INSERT, UPDATE ou DELETE).
Ici pour faire votre contrôle on va choisir de le faire AVANT INSERT et AVANT UPDATE.
Dans un trigger on a accès aux anciennes et aux nouvelles valeurs de l'enregistrement à insérer ou mettre à jour. (Dans le cas d'un insert on ne se sert que des nouvelles valeurs).
Pour cela il suffit de préfixer les champs par OLD. pour les anciennes valeurs et NEW. pour les nouvelles valeurs.
Et pour signaler l'erreur, le plus simple est de créer une exception :
CREATE EXCEPTION ERR_DATE_ARRIVE_SUP_CREATION 'Erreur, la date d''arrivée doit être plus grande ou égale à la date de création du courrier.';
Donc le triggers serait du type :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| SET TERM ^ ;
CREATE OR ALTER TRIGGER TB_ARRIVEE_BIU0 FOR TB_ARRIVEE
ACTIVE BEFORE INSERT OR UPDATE POSITION 0
AS
declare variable date_correspondance date;
begin
/* Rechercher la date de correspondance du courrier correspondant
à l'enregistrement ARRIVE à vérifier */
select c.DATE_CORRESPONDANCE
from TB_COURRIER c
where c.id=NEW.id_courrier
into :DATE_CORRESPONDANCE;
/* Si la date du courrier est plus grande que la date d'arrivée
signaler l'erreur */
if (DATE_CORRESPONDANCE>NEW.date_enregistrement) then
exception ERR_DATE_ARRIVE_SUP_CREATION;
end
^
SET TERM ; ^ |
Partager