Controlebeperkingen moeten deterministisch zijn. Dat wil zeggen dat een bepaalde rij altijd aan de beperking moet voldoen of dat deze altijd niet aan de beperking moet voldoen. Maar SYSDATE
is inherent niet-deterministisch, aangezien de geretourneerde waarde voortdurend verandert. U kunt dus geen CHECK
. definiëren beperking die SYSDATE
. aanroept of een andere door de gebruiker gedefinieerde functie.
Als u probeert te verwijzen naar SYSDATE
in de beperkingsdefinitie krijg je een foutmelding
SQL> ed
Wrote file afiedt.buf
1 create table t(
2 birth_date date check( birth_date between date '1900-01-01' and
3 sysdate )
4* )
SQL> /
sysdate )
*
ERROR at line 3:
ORA-02436: date or system variable wrongly specified in CHECK constraint
Je zou een CHECK
. kunnen maken beperking waarbij zowel de minimum- als maximumdatum hard gecodeerd waren, maar dat zou niet bijzonder praktisch zijn, omdat je de beperking constant zou moeten laten vallen en opnieuw moet creëren.
SQL> ed
Wrote file afiedt.buf
1 create table t(
2 birth_date date check( birth_date between date '1900-01-01' and
3 date '2011-12-08' )
4* )
SQL> /
Table created.
De praktische manier om dit soort vereisten af te dwingen zou zijn om een trigger op de tafel te creëren
CREATE OR REPLACE TRIGGER check_birth_date
BEFORE INSERT OR UPDATE ON employee
FOR EACH ROW
BEGIN
IF( :new.emp_dob < date '1900-01-01' or
:new.emp_dob > sysdate )
THEN
RAISE_APPLICATION_ERROR(
-20001,
'EMployee date of birth must be later than Jan 1, 1900 and earlier than today' );
END IF;
END;