Kontrollbegränsningar måste vara deterministiska. Det vill säga, en viss rad måste alltid uppfylla begränsningen eller så måste den alltid misslyckas med att uppfylla begränsningen. Men SYSDATE
är i sig icke-deterministisk eftersom det returnerade värdet ständigt förändras. Du kan alltså inte definiera en CHECK
begränsning som anropar SYSDATE
eller någon annan användardefinierad funktion.
Om du försöker referera till SYSDATE
i begränsningsdefinitionen får du ett fel
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 skapa en CHECK
begränsning där både lägsta och högsta datum var hårdkodade men det skulle inte vara särskilt praktiskt eftersom du hela tiden måste släppa och återskapa 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.
Det praktiska sättet att upprätthålla denna typ av krav skulle vara att skapa 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;