À l'aide de la date dans une contrainte check, Oracle
Je suis en train d'ajouter le suivant contrainte, mais Oracle renvoie l'erreur indiqué ci-dessous.
ALTER TABLE Table1
ADD (CONSTRAINT GT_Table1_CloseDate
CHECK (CloseDate > SYSDATE),
CONSTRAINT LT_Table1_CloseDate
CHECK (CloseDate <= SYSDATE + 365)),
CONSTRAINT GT_Table1_StartDate
CHECK (StartDate > (CloseDate + (SYSDATE + 730))));
Erreur:
Error report:
SQL Error: ORA-02436: date or system variable wrongly specified in CHECK constraint
02436. 00000 - "date or system variable wrongly specified in CHECK constraint"
*Cause: An attempt was made to use a date constant or system variable,
such as USER, in a check constraint that was not completely
specified in a CREATE TABLE or ALTER TABLE statement. For
example, a date was specified without the century.
*Action: Completely specify the date constant or system variable.
Setting the event 10149 allows constraints like "a1 > '10-MAY-96'",
which a bug permitted to be created before version 8.
Vous devez vous connecter pour publier un commentaire.
Une contrainte check, malheureusement, ne peut pas référencer une fonction SYSDATE. Vous devez créer un déclencheur qui a vérifié ces valeurs lors de la DML se produit, c'est à dire
Vous ne pouvez pas utiliser SYSDATE dans la vérification de la contrainte. Selon la documentation
Pour 10g Release 2 (10.2), voir contrainte, et pour 11g Release 2 (11.2) voir contrainte.
N'oubliez pas qu'une contrainte d'intégrité est une déclaration sur les données de la table de toujours vrai.
De toute façon: je ne sais pas exactement ce que vous essayez d'atteindre, mais je pense que vous pouvez utiliser déclenche à cette fin.
Écrire sysdate dans une colonne et de les utiliser pour la validation. Cette colonne peut être votre audit de la colonne (Par exemple: date de création)
Chaque fois que l'enregistrement est mis à jour SYSDATE aura une valeur différente. Par conséquent, la contrainte de valider de façon différente à chaque fois. Oracle ne permet pas sysdate dans une contrainte pour cette raison.
Vous serez en mesure de résoudre votre problème avec une gâchette qui vérifie si CloseDate a réellement changé et déclencher une exception lorsque la nouvelle valeur n'est pas dans la gamme.
Et: qu'est-Ce que
(StartDate > (CloseDate + (SYSDATE + 730))))
? Vous ne pouvez pas ajouter des dates.Et:
StartDate
doit être aprèsCloseDate
? N'est-ce pas bizarre?Vous pouvez atteindre cet objectif lorsque vous faites un peu de tricher, comme ceci:
Bien sûr, la fonction
SYSDATE_DETERMINISTIC
est pas déterministe, mais Oracle permet de déclarer cela de toute façon.Peut-être dans les futures versions d'Oracle devient de plus en plus intelligents et ne permettront pas de tels tours.
Je ne recommande pas de chanter les déclencheurs en tant que contrainte et de lever des exceptions, au Lieu de cela, vous pouvez utiliser une colonne pour stocker SYSDATE que la date d'enregistrement(si vous l'avez déjà, alors vous pouvez l'utiliser), puis votre contrainte compare cette colonne au lieu de SYSDATE