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 :
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.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
Je crée donc une fonction pour vérifier cela qui donne ceci :
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.
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 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
Merci d'avance.
Partager