Hello tout le monde.
J'ai une table de ce genre qui me permet de gérer l'historique de prêt d'un objet (dans mon cas un PC) :
J'ai l'identifiant de l'objet avec une date de début de prêt et une date de fin, s'il y a lieu.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 PC_ID | DAT_DEB | DAT_FIN -------------------------------------------------------- 1 | 2001-01-04 00:00:00.000 | NULL 2 | 2001-01-05 00:00:00.000 | NULL 3 | 2001-01-06 00:00:00.000 | 2002-01-06 00:00:00.000 5 | 2001-01-01 00:00:00.000 | NULL 6 | 2001-01-02 00:00:00.000 | NULL 7 | 2001-01-03 00:00:00.000 | NULL
J'aimerais créer un trigger qui vérifierait qu'à l'insertion d'une ligne la date de début à insérer ne soit pas antérieure à la dernière date de fin de l'objet concerné.
Pour l'instant j'ai ça :
J'exécute la requête suivante :
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
22
23
24
25
26
27
28
29
30
31
32 CREATE TRIGGER TRG_PC_HISTO ON PC_HISTO FOR INSERT AS BEGIN DECLARE @errno INTEGER, @errmsg VARCHAR(255), @dt1 datetime, @dt2 datetime SET @errno = 0 /* L'historique doit être cohérent. */ set @dt1 = (SELECT MAX(dat_fin) FROM pc_histo WHERE PC_ID IN (SELECT PC_ID FROM INSERTED)) set @dt2 = (SELECT DAT_DEB FROM INSERTED) IF @dt1 > @dt2 BEGIN SET @errno = 666004 SET @errmsg = 'Erreur sur les dates, historique non-cohérent. MAX(dat_fin) (' + cast(@dt1 as varchar(50)) + ') DAT_DEB(' + CAST(@dt2 as varchar(50)) + ')' END /* Gestion d'erreurs */ IF (@errno <> 0) BEGIN RAISERROR @errno @errmsg ROLLBACK TRANSACTION END RETURN END
Et j'obtiens l'erreur suivante :
Code : Sélectionner tout - Visualiser dans une fenêtre à part insert into pc_histo (pc_id, dat_deb, dat_fin) values (3, CAST('06/01/2002' as datetime), CAST('07/01/2003' as datetime))
J'en conclut que l'insertion a lieu avant l'éxécution du trigger, puisque ma date de fin maximum est celle de ma requête d'insertion qui n'apparaît pas dans la table au début.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 Msg 666004, Niveau 16, État 1, Procédure TRG_PC_USR, Ligne 63 Erreur sur les dates, historique non-cohérent. MAX(dat_fin) (janv 7 2003 12:00AM) DAT_DEB(janv 6 2002 12:00AM)
Quelqu'un a-t-il une solution pour que je puisse tester les valeurs de ma table avant que l'insertion ne soit faite ?
Partager