Sprawdź ograniczenia muszą być deterministyczne. Oznacza to, że określony wiersz musi zawsze spełniać ograniczenie lub zawsze musi nie spełniać ograniczenia. Ale SYSDATE
jest z natury niedeterministyczny, ponieważ zwracana wartość stale się zmienia. Dlatego nie możesz zdefiniować CHECK
ograniczenie, które wywołuje SYSDATE
lub dowolna inna funkcja zdefiniowana przez użytkownika.
Jeśli spróbujesz odwołać się do SYSDATE
w definicji ograniczenia otrzymasz błąd
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
Możesz utworzyć CHECK
ograniczenie, w którym zarówno minimalna, jak i maksymalna data były zakodowane na stałe, ale nie byłoby to szczególnie praktyczne, ponieważ musiałbyś stale usuwać i odtwarzać ograniczenie.
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.
Praktycznym sposobem wymuszenia tego rodzaju wymogu byłoby utworzenie wyzwalacza 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;