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) :
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'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.

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 :
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
J'exécute la requête 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))
Et j'obtiens l'erreur suivante :
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)
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.

Quelqu'un a-t-il une solution pour que je puisse tester les valeurs de ma table avant que l'insertion ne soit faite ?