J'ai un doute sur les contraintes CHECK
Hello,
Une rapide question au sujet des contraintes CHECK car un doute m'habite.
Est-ce que le check est fait avant ou après l'insertion de la/des ligne/s ?
Un cas concret...
Soit la table suivante :
Code:
1 2 3 4 5 6 7 8
| CREATE TABLE T(
ID INT IDENTITY(1,1) NOT NULL PRIMARY KEY,
CODE SMALLINT NOT NULL,
STARTDATE DATE NOT NULL,
ENDDATE DATE NOT NULL)
GO
ALTER TABLE T WITH CHECK ADD CONSTRAINT AK_T UNIQUE (CODE, STARTDATE)
GO |
Jusque là, pas de souci. Maintenant, en plus de cette contrainte d'unicité, je voudrais ajouter une contrainte check qui interdit le chevauchement de période pour un même code.
Je crée donc une fonction pour vérifier cela qui donne ceci :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| CREATE FUNCTION S_HP.UF_CHECK_OVERLAPPING_CODE(@CODE SMALLINT, @START DATE, @END DATE) RETURNS BIT
AS
BEGIN
DECLARE @RESULT BIT
IF EXISTS ( SELECT 1
FROM T
WHERE CODE = @CODE
AND dbo.OVERLAPS(@START, @END, STARTDATE, ENDDATE) = 1)
SET @RESULT = 1
ELSE
SET @RESULT = 0
RETURN @RESULT
END
GO |
Maintenant, si le check se fait après l'insertion, le résultat sera toujours 1 et il faut que j'ajoute une branche dans la clause WHERE pour exclure la ligne en cours de check sur base de son ID. Je pourrais le faire d'office et ne pas me poser de question mais j'aime bien faire les choses correctement.
Merci d'avance.