Bonjour à tous,

Je galère depuis un petit moment sur un trigger qui devrait empêcher qu'un individu puisse exercer deux emplois en même temps. Ça se passe donc sur une table exercer_travail qui, sur un MCD, ferait association entre une table employeur et une table individu.

Je vous montre où est-ce que j'ai commencé à m'embarquer. Ça ressemble à un trigger avec une petite tendance curseur. Je ne savais pas si on pouvais faire ce genre d'association, mais à priori rien ne s'y opposait. Après il y a le fait qu'il n'y ait pas d'OVERLAPS avec MSSQL2000 donc j'ai dû improviser (à partir de ce message très utile de SQLpro). Enfin, pour ce qui est des CONVERT j'ai de sérieux doutes sur leur bonne utilisation.
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
33
34
35
36
37
38
39
40
41
42
create trigger contrainte_pas_2_emplois_en_meme_temps
on exercer_travail
for insert
BEGIN
	declare @dateDbtIns int;
	declare @dateFinIns int;
	declare @curseur cursor;
	declare @date_debut int;
	declare @date_fin int;
	declare @msg char(110);
	declare @errno int;
 
	BEGIN
		select @dateDbtIns=CONVERT(INTEGER, inserted.code_date, 112) from inserted;
		select @dateFinIns=CONVERT(INTEGER, inserted.date_fin, 112) from inserted;
 
		set @curseur = cursor for (select CONVERT(INTEGER, exercer_travail.code_date, 112), CONVERT(INTEGER, exercer_travail.date_fin, 112) from exercer_travail, inserted where exercer_travail.code_individu = inserted.code_individu);
		open @curseur
		fetch next from @curseur into @date_debut, @date_fin
		while @@FETCH_STATUS = 0
		BEGIN
			/*Un gros if bien lourd parce qu'apparemment OVERLAPS n'existe pas sur MSSQL 2000 */
			if((@dateDbtIns > @date_debut AND (@dateDbtIns < @date_fin OR @dateFinIns < @date_fin))
				OR (@date_debut > @dateDbtIns AND (@date_debut < @dateFinIns OR @date_fin < @dateFinIns))
				OR (@dateDbtIns = @date_debut AND (@dateFinIns IS NOT NULL AND @date_fin IS NOT NULL)))
			BEGIN
				set @msg = 'Cette personne exerce déjà un emploi dans cette période. Une personne ne peut exercer 2 emplois en même temps.';
				set @errno = 30003;
				goto erreur;
			END
			else
			BEGIN
				commit
			END
			fetch next from @curseur into @date_debut, @date_fin
		END
		return
		erreur:
			raiserror @errno @msg;
			rollback transaction;
	END
END
En bref, je n'arrive à rien. Ça ne marche pas du tout. Je n'ai pas de message d'erreur à la création du trigger mais je n'en ai pas non plus lors des insertions avec des dates chevauchantes.

Je m'en remet à vous pour savoir ce qui ne va pas.