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 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81
| CREATE TRIGGER contrainte_pas_2_emplois_en_meme_temps
ON exercer_travail
FOR INSERT
AS
BEGIN
DECLARE @szErreur VARCHAR(256)
-- Collecte dans @szErreur de la liste des IDEmploye, séparés par
-- des virgules, qui ont des périodes de travail qui se chevauchent
SELECT @szErreur = ISNULL(@szErreur, '') + CAST(IDEmploye AS VARCHAR(10)) + ', '
FROM
(
SELECT PERIODE_1.IDEmploye,
PERIODE_1.DateDeb1,
PERIODE_1.DateFin1,
PERIODE_2.DateDeb2,
PERIODE_2.DateFin2
FROM (
SELECT A.IDEmploye,
A.code_date,
A.date_fin,
COUNT(*)
FROM dbo.exercer_travail A
JOIN INSERTED B
ON A.IDEmploye = B.IDEmploye
AND A.code_date <= B.code_date
AND A.date_fin <= B.date_fin
GROUP BY A.IDEmploye,
A.code_date,
A.date_fin
) PERIODE_1 (IDEmploye, DateDeb1, DateFin1, Rang)
JOIN(
SELECT A.IDEmploye,
A.code_date,
A.date_fin,
COUNT(*)
FROM dbo.exercer_travail A
JOIN INSERTED B
ON A.IDEmploye = B.IDEmploye
AND A.code_date <= B.code_date
AND A.date_fin <= B.date_fin
GROUP BY A.IDEmploye,
A.code_date,
A.date_fin
) PERIODE_2 (IDEmploye, DateDeb2, DateFin2, Rang)
ON PERIODE_1.IDEmploye = PERIODE_2.IDEmploye
AND
(
(
PERIODE_1.DateDeb1 > PERIODE_2.DateDeb2
AND PERIODE_1.DateDeb1 < PERIODE_2.DateFin2
AND PERIODE_2.DateFin2 > PERIODE_1.DateDeb1
AND PERIODE_2.DateFin2 < PERIODE_1.DateFin1
)
OR
(
PERIODE_2.DateDeb2 > PERIODE_1.DateDeb1
AND PERIODE_2.DateDeb2 < PERIODE_1.DateFin1
AND PERIODE_2.DateFin2 > PERIODE_1.DateFin1
)
OR
(
PERIODE_2.DateDeb2 >= PERIODE_1.DateDeb1
AND PERIODE_2.DateFin2 <= PERIODE_1.DateFin1
)
)
AND PERIODE_1.Rang < PERIODE_2.Rang
) TMP (IDEmploye, DateDeb1, DateFin1, DateDeb2, DateFin2)
-- Si la chaîne est valuée (<=> IS NOT NULL), alors on lève un exception
-- et on défait la transaction
IF @szErreur IS NOT NULL
BEGIN
SET @szErreur = 'Les employés d''identifiant %s ne peuvent avoir des périodes d''emploi se chevauchant.', 16, 1, @szErreur)
RAISERROR(@szErreur, 16, 1)
ROLLBACK TRANSACTION
END
-- Sinon, il n'y a pas d'employés pour lesquels on a tenté d'ajouter des emplois dont les périodes
-- chevauchent des périodes durant lesquelles l'employé est déjà affecté à une mission
-- La transaction sera donc validée automatiquement
END |
Partager