As restrições de verificação devem ser determinísticas. Ou seja, uma linha específica sempre deve satisfazer a restrição ou sempre deve deixar de satisfazer a restrição. Mas
SYSDATE
é inerentemente não determinístico, pois o valor retornado está mudando constantemente. Assim, você não pode definir um CHECK
restrição que chama SYSDATE
ou qualquer outra função definida pelo usuário. Se você tentar fazer referência a
SYSDATE
na definição de restrição, você receberá um erro 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
Você pode criar um
CHECK
restrição em que a data mínima e máxima foram codificadas, mas isso não seria particularmente prático, pois você teria que descartar e recriar constantemente a restrição. 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.
A maneira prática de impor esse tipo de requisito seria criar um gatilho na tabela
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;