Check-begrænsninger skal være deterministiske. Det vil sige, at en bestemt række altid skal opfylde begrænsningen, eller den skal altid undlade at opfylde begrænsningen. Men SYSDATE
er i sagens natur ikke-deterministisk, da den returnerede værdi konstant ændrer sig. Du kan således ikke definere en CHECK
begrænsning, der kalder SYSDATE
eller enhver anden brugerdefineret funktion.
Hvis du prøver at henvise til SYSDATE
i begrænsningsdefinitionen får du en fejl
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
Du kan oprette en CHECK
begrænsning, hvor både minimums- og maksimumsdatoen var hårdkodet, men det ville ikke være særlig praktisk, da du konstant skulle slippe og genskabe begrænsningen.
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.
Den praktiske måde at håndhæve denne form for krav på ville være at skabe en trigger på bordet
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;