Omezení kontroly musí být deterministické. To znamená, že určitý řádek musí vždy splňovat podmínku nebo musí vždy podmínku nesplňovat. Ale SYSDATE
je ze své podstaty nedeterministický, protože vrácená hodnota se neustále mění. Nemůžete tedy definovat CHECK
omezení, které volá SYSDATE
nebo jakoukoli jinou uživatelem definovanou funkci.
Pokud se pokusíte odkazovat na SYSDATE
v definici omezení se zobrazí chyba
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
Můžete vytvořit CHECK
omezení, kde minimální i maximální datum bylo pevně zakódováno, ale to by nebylo zvlášť praktické, protože byste museli omezení neustále rušit a znovu vytvářet.
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.
Praktickým způsobem, jak vynutit tento druh požadavku, by bylo vytvořit spouštěč na stole
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;