Проверка ограничений должна быть детерминированной.То есть конкретная строка всегда должна удовлетворять ограничению, или она всегда должна не удовлетворять ограничению.Но SYSDATE
по своей сути недетерминирован, поскольку возвращаемое значение постоянно меняется.Таким образом, вы не можете определить ограничение CHECK
, которое вызывает SYSDATE
или любую другую пользовательскую функцию.
Если вы попытаетесь сослаться на SYSDATE
в определении ограничения, вы получите ошибку
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
Вы можете создать ограничение CHECK
, в котором минимальная и максимальная дата жестко закодированы, но это не будет особенно практично, поскольку вам придется постоянно отбрасывать и заново создавать ограничение.
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.
Практическим способом применения такого рода требований является создание триггера для таблицы
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;